小白的python学习之路-python new方法的自我认知
本文为个人观点不喜勿喷, python版本 3.7
python __new__方法,是创建实例对象的主战场,被python 解释器自行调用执行。
python基类Object,作为最终的选择,如当前类未重写__new__方法,则会执行直接父类的__new__方法(继承关系复杂会出现多继承问题)。
实例对象是什么类型,是由__new__方法决定的,这也就是为啥单例指向的内存ID唯一的原因,这里要注意的是,__new__方法一定要有返回值,不写返回None
class Demo:
def __new__(cls, *arges, **kwargs):
pass
demo = Demo()
print(demo, type(demo)) # ==> None <class NoneType>
class Demo:
def __new__(cls, *arges, **kwargs):
return
demo = Demo()
print(demo, type(demo)) # ==> None <class NoneType>
class Demo:
def __new__(cls, *args, **kwargs):
return 1 # 任性 就返回 1
demo = Demo()
print(demo, type(demo)) # ==> 1 <class int>
class Demo:
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
demo = Demo()
print(demo, type(demo)) # ==> <__main__.Demo object at 0x00xxxx> <class __main__.Demo>
一般的,创建一个类都会添加构造函数__init__方法,__init__方法的返回值应该是None。
而实例对象的创建是先执行__new__方法,待返回的实例类型是当前类cls才会执行__init__方法
class Demo(object):
def __new__(cls, *args, **kwargs):
return 1
def __init__(self):
print(执行构造函数)
demo = Demo()
print(demo, type(demo)) # ==> 1 <class int>
上述 所见,当__new__方法返回类型不是当前类时, 是不会执行__init__ 方法,因为他们已经不是"一类人"了
那么咋才能如出一辙呢, 那就是__new__方法 返回当前类cls的实例
class Demo(object):
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
def __init__(self):
print(执行构造函数)
demo = Demo()
print(demo, type(demo))
执行结果依次是:
执行构造函数
<__main__.Demo object at 0x00000xx> <class __main__.Demo>
