__new__ 与 __init__

_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 用来初始化实例,为其实例设置属性。

猜你喜欢

转载自blog.csdn.net/Light__1024/article/details/85837173