_new_ 与 _init_
在定义类时,通常写__init__方法,不写__new__方法。实例化对象时会自动调用内置的__new__方法,返回一个空对象,然后调用__init__给实例化对象加独有属性。
class People:
pass
print(dir(People)) # 列表形式,其中有'__new__',
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
如果class类时写了__new__方法,要返回一个实例,return父类__new__出来的实例,或者直接是object的__new__出来的实例,不然无法实例化。
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
print('new方法不返回值')
p1 = People('小明', 18)
# new方法不返回值
print(p1)
# None
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs): # 调用object__new__方法
return object.__new__(cls)
p1 = People('小明', 18)
print(p1.name)
小明
_new__的第一个占位参数是class对象,init__的第一个占位参数是class的实例对象,_new_ 用来创建实例,在返回的实例上执行__init,如果不返回实例那么__init__将不会执行,init 用来初始化实例,为其实例设置属性。