Python中中__new__和和__init__的区别与联系的区别与联系
__new__和__init__的区别主要表现在:它自身的区别及在Python中新式类和老式类的定义。
__new__ 负责对象的创建而 __init__ 负责对象的初始化。
__new__:创建对象时调用,会返回当前对象的一个实例
__init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值
1. 在类中,如果在类中,如果__new__和和__init__同时存在,会优先调用同时存在,会优先调用__new__
class ClsTest(object):
def __init__(self):
print("init")
def __new__(cls,*args, **kwargs):
print("new")
ClsTest()
执行结果出:
new
2. 如果如果__new__返回一个对象的实例,会隐式调用返回一个对象的实例,会隐式调用__init__
class ClsTest(object):
def __init__(self):
print ("init")
def __new__(cls,*args, **kwargs):
print ("new %s"%cls)
return object.__new__(cls, *args, **kwargs)
ClsTest()
执行结果为:
new
init
3. __new__方法会返回所构造的对象,方法会返回所构造的对象,__init__无返回值。无返回值。
class ClsTest(object):
def __init__(cls):
cls.x = 2
print ("init")
return cls ClsTest()
执行结果为:
init
Traceback (most recent call last):
File "", line 1, in
TypeError: __init__() should return None, not 'ClsTest'
4. 若若__new__没有正确返回当前类没有正确返回当前类cls的实例,那的实例,那__init__是不会被调用的,即使是父类的实例也不行是不会被调用的,即使是父类的实例也不行
class ClsTest1(object):
pass
class ClsTest2(ClsTest1):
def __init__(self):
print ("init")
def __new__(cls,*args, **kwargs):
print ("new %s"%cls)
return object.__new__(ClsTest1, *args, **kwargs)
b=ClsTest2()
print (type(b))
执行结果为:
new
知识点知识点
继承自object的新式类才有__new__
评论0
最新资源