python 进阶(0) -- __new__ 与 __init__


今宵明月,绝不西沉。只此美梦,不再苏醒


__new__

对象的创建,是一个静态方法,第一个参数是 cls

当我们常见对象 c = MyClass() 的时候,__new__ 方法会被默认调用创建一个 MyClass 新对象,因此,因为没有对象,所以第一个参数就不可能是 self

关于 self 的理解:http://pinsily.site/index.php/archives/272/

class Bar(object):
    pass

class Foo(object):
    def __new__(cls,*args, **kwargs):
    return Bar()

print(Foo())

# Output:
# <__main__.Bar object at 0*00000000006F5390>

可以看出,返回的是 Bar 的一个对象


__init__

对象的初始化,是一个实例方法,第一个参数是 self,也就是 __new__ 方法创建的对象

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
pinsily = Person('pinsily', 22)

总结

一个实例对象的生成,先经过 __new__ 方法创建对象,然后将对象传递给 __init__self 参数,实现初始化