- __new__方法在__init__方法执行前执行
- __new__方法是个classmethod方法,所以默认一个参数是cls
- super当其放在__new__方法中时super(类名,cls).new(cls),第一个括弧中的内容可以省略,但是的二个cls不能省略,否则报错。
class Person():
def __init__(self,name,age):
print('__init__被调用')
self.name=name
self.age=age
print('__init__传入的参数是{},{}'.format(self.name,self.age))
def __new__(cls,nam,ag):#由于__new__是类方法所以第一个参数是cls,另外的参数要与init中参数数量一致,名字可以不一致
print('__new__被调用')
print('__new__传入的参数是{},{}'.format(nam,ag))
# return super().__new__(cls)#注释掉这行会发现__init__方法不再执行,此时就要像下面这种写法
return cls.__init__(cls,nam,ag)#这个写法也是可以的
def __str__(self):
return ('<Person:{}({})'.format(self.name,self.age))
if __name__=='__main__':
piglei=Person('piglei',24)
print(piglei)
else:
pass
运行结果:
__new__被调用
__new__传入的参数是piglei,24
__init__被调用
__init__传入的参数是piglei,24
<Person:piglei(24)