小白的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>
经验分享 程序员 微信小程序 职场和发展