关于__init__()方法的一些理解:
1.__init__()的第一种应用
先上代码:
class Time:
#__init__()方法在类实例化时会被自动调用
def __init__(self):
print(1)
代码执行,会有:
>>> t = Time()
1
>>>
此即为__init__()方法的第一种应用,
在进行类的实例化时,__init__方法自动执行。此处,我们的__init__()方法会打印一个1,在实例化后就自动打印出来。
即使如此,__init__()方法不是第一个被调用的方法,若是使用了__new__()方法,__new__()方法会在__init__方法之前被调用,并且__new__()是所有方法中第一个被调用的(若是使用了)。
__new__()方法网上讲解很多,但是私以为,其更像盗版商和打印机。
顺便说一下:
如果此时在类的实例化时传入参数,则会报错,代码如下:
>>> n = Time(1)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
n = Time(1)
TypeError: __init__() takes 1 positional argument but 2 were given
报错内容大概是:__init__()方法仅接收一个参数,却给了两个。
这里是因为,前文中对于__init__()方法定义时,仅定义了一个形式参数self,而在类的实例化时会自带一个self参数(它是隐形的,很酷!)。
2.__init__()的第二种应用
先上代码:
class Time:
#__init__方法除了在类的实例化时自动被调用,同时也会吸收类的实例化时传入
#方法的实际参数,并且表达出来,例:
def __init__(self,hour = 0,minute = 0,second = 0):
self.hour = hour
self.minute = minute
self.second = second
此处,我们将hour,minute和second三个形式参数写为关键字参数形式,即将其初始化为(0,0,0)(我这里写作元组形式,仅仅是为了方便表达,其值存储在内存中的形式仍不为我所知)
代码执行时,会有:
>>> n = Time(4)
>>> t.hour,t.minute,t.second
(4, 0, 0)
此处,与1中不同的是,我们传入了一个参数:4。这次没有报错,因为在__init__()定义时,我们写了的是:__init__(self,hour = 0,minute = 0,second = 0 ),此处定义了总计四个参数。
但是我们仅仅传入一个参数,为何没有报错?这是因为,在python中,如果传入的参数小于定义的参数,就会从第一个往后算,传入一个就会被当做第一个形式参数。(我这里给的4,便被当作hour的值,并且在类中覆盖了初始定义的hour = 0,若是传入两个,则会覆盖hour和minute,以此类推)