Python3.x:类的特殊成员方法__new__

先来探索下生命的起源,在python中,万物皆为对象,只要是对象就有类
我们自己写的类不也是对象么?那么它的类是什么?


Python3.x:类的特殊成员方法__new___第1张图片

可以看到,对象a的类是People,People的类是type
WTF?type不是个内置方法么?怎么成类的类了?

没错,类的类就是type

既然我们知道了类的类是type,那么接下来说一个与众不同的装逼的创建类的方法

# 写了两个函数一个构造函数b一个函数a
def b(self, name, age):
    self.name = name
    self.age = age


def a(self):
    print('%s is %s' % (self.name, self.age))


# 使用类的类type实例化生成一个类People
People = type('People', (object,), {'__init__': b,
                                    'talk': a})

# 实例化生成对象man1
man1 = People('James', 18)

# 调用函数talk()
man1.talk()  # James is 18

# type第一个参数:生成类的名字
# type第二个参数:生成类的父类(注意写法要在后面加个逗号,这样可以判定为元组)
# type第三个参数:生成类所拥有的成员(上面定义的构造函数可以任意命名,但是这里必须要写'__init__')
Python3.x:类的特殊成员方法__new___第2张图片

这样我们就实现了通过type实例化生成一个类,同时也要知道,类是由type实例化生成的

下面讲一下__new__函数,这个函数是一个类自带的函数,但是不会显示,就好像你写一个函数自带return,只是不显示,而且还可以重构,同时也是你在实例化之前自动执行的,并且执行顺序要先于构造函数__init__,如果想要在构造函数执行之前做一些事情就可以重构__new__函数,但是要尽量少的重构__new__函数,因为如果你重构之后的函数改变了原本的一些进程,会导致无法实例化

Python3.x:类的特殊成员方法__new___第3张图片

可以看出, __new__函数先于构造函数 __init__执行
既然 __new__执行完了执行 __init__那么谁调用的 __new__方法呢?
是父类(可以使用 __metaclass__指定)中 __call__函数,但是具体的过程不做解释了,可以通过解析源码来了解其中的过程

转载请注明出处

python自学技术互助扣扣群:670402334

你可能感兴趣的:(Python3.x:类的特殊成员方法__new__)