首页 > 编程语言 > 详细

python基础-面向对象(二十七)面向对象进阶(十五)元类(二)__call__,__new__,__init__

时间:2020-12-19 09:28:57      阅读:35      评论:0      收藏:0      [点我收藏+]

 

上次说的,Test(metaclass=Mytype),会调用Mytype的__new__,__init__,其实是先调用Mytype的元类的__call__来实现的。证明看下面

class Mymete(type):
    def __init__(self,*args, **kwargs):
        pass
    def __call__(self, *args, **kwargs):
        print(=====>1)


class Mytype(metaclass=Mymete):
    def __init__(self, *args, **kwargs):
        print(=====>init)

    def __new__(cls, *args, **kwargs):
        print(=====>new)
        obj = super().__new__(cls)  # 调用父类的new
        return obj
    def __call__(self, *args, **kwargs):
        print(=====>call)

class Test(metaclass=Mytype):
    def __init__(self, name):
        pass

技术分享图片

 

 执行流程

技术分享图片

 

 Test(metaclass=Mytype),也就是Test=Mytype(),生成Test,会先去调用Mytype的元类的__call__..系统默认__call__会先调用Mytype的__new__,生成对象以后,在调用Mytype的__init__,最后返回对象。

 

class Mymete(type):  # 元类必须是继承type
    def __init__(self, *args, **kwargs):
        pass

    def __call__(self, *args, **kwargs):  # self是Mytype
        Mytype_obj = self.__new__(self)
        self.__init__(Mytype_obj, *args, **kwargs)
        return Mytype_obj

    ‘‘‘ 第一步,调用Mytype的__new__,
        第二步,调用Mytype的__init__
        第三步,返回Mytype实例的对象‘‘‘


class Mytype(metaclass=Mymete):  # self是Test
    def __init__(self, x, y, z):
        if not x.istitle():  # 对首字母判断后在初始化
            raise TypeError(首字母没大写)
        self.name = x

    def __new__(cls, *args, **kwargs):
        obj = super().__new__(cls)  # 调用父类的new
        return obj

    def __call__(self, *args, **kwargs):
        print(=====>call)


class test(metaclass=Mytype):
    def __init__(self, name):
        pass

技术分享图片

 

python基础-面向对象(二十七)面向对象进阶(十五)元类(二)__call__,__new__,__init__

原文:https://www.cnblogs.com/liaoyifu/p/14156138.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!