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

作者: james_chang | 来源:发表于2018-02-07 14:30 被阅读34次

    先来探索下生命的起源,在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

    相关文章

      网友评论

        本文标题:Python3.x:类的特殊成员方法__new__

        本文链接:https://www.haomeiwen.com/subject/ykyozxtx.html