生活不易 我用pythonPython自学与资料分享程序员

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

2018-02-07  本文已影响34人  james_chang

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



可以看到,对象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__')

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

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


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

转载请注明出处

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

上一篇下一篇

猜你喜欢

热点阅读