__init__(self) | __new__(cls) |
参数是self : 实例化对象 | 参数cls : 表示当前类本身 |
无返回值 | 又返回值 |
对实例化对象进行初始化操作 | 为实例化对象开辟内存空间,创建空对象 |
在创建对象时自动被调用 | 在创建对象时自动被调用,new在init之前先被调用 |
new先开辟内存空间,创建一个空的对象,再将创建的空的对象return给init; init再在开辟的内存空间内对这个空对象进行初始化,包括对象的属性。 如果new没有return那么init方法就不会被调用 | |
绝大多数时间不需要我们实现__new__ 方法,python已经帮我们实现:使用父类的__new__() 方法来创建对象并返回. 所以例子1中的两个类是等价的 | |
__init__(self, par1, par2) 和__new__(cls, par1, par2)中的参数及其个数要保持一致, 否则会报错。因为在初始化对象时都会经过__new__(cls)方法,所以一般new方法参数写成可变参数__new__(cls, *args, **kwargs)来保持与init中参数个数一致。 | |
可以只用__new_(cls, *args, **kwargs)而不用__init__(self)来实例化对象(我们创建类时不写new因为python中默认隐藏new方法,如例子2) |
例子 1:
class testA(object):
def __new__(cls, *args, **kwargs):
return super().__new__(cls)
def foncA(self):
print("fonction A")
class testB(object):
def foncB(self);
print("fonction B")
__new__(cls)中第一个参数是cls,是因为cls相当于c当前的lass调用__new__(cls)时,实例对象还没有被创建出来。
大部分情况都不需要实现__new__(cls)方法,因为python中已经默认实现,使用父类super().__new__(cls)方法创建对象并将对象放回给init,所以以上代码是等价的。
例子2:
class Person(object):
def __new__(cls, age):
print('__new__() called.')
obj = super().__new__(cls)
obj.age = age
return obj
a = Person(100)
a.age # 100
如上的写法正确但是不建议,一般采用如下写法
class Person(object):
def __init__(self, age):
self.age = age
a = Person(100)
a.age # 100
常用定义类的完整写法应该是
class Person(object):
def __new__(cls, *args, **kwargs):
return super().__new__(cls)
def __init__(self, age):
self.age = age
a = Person(100)
a.age # 100