• python_107_ __metaclass__ 元类


    类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

    答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

    class MyType(type):
        def __init__(self,what,bases=None,dict=None):
            print("--MyType init--")
            super(MyType,self).__init__(what,bases,dict)
        def __call__(self, *args, **kwargs):
            print("--MyType init--")
            obj = self.__new__(self,*args, **kwargs)
            self.__init__(obj,*args, **kwargs)
    
    class Foo(object):
        __metaclass__ = MyType#此两行可写成class Foo(object,metaclass=MyType):
        def __init__(self,name):
            self.name = name
            print("Foo --init__")
        def __new__(cls, *args, **kwargs):#__new__是用来创建实例的(尽量不用),调用__init__(先于__init__执行)
            print("Foo --new--",cls, *args, **kwargs)
            return object.__new__(cls)#继承父类的__new__方法
    #第一阶段:解释器从上到下执行代码创建Foo类
    #第二阶段:通过Foo类创建obj对象
    obj = Foo("Alex")
    print(obj.name)
    # 自定义元类

    上述代码在python2中效果可看出

    结果:

    类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

    http://www.cnblogs.com/alex3714/articles/5213184.html

     metaclass 详解文章:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 得票最高那个答案写的非常好

  • 相关阅读:
    【面试】前端基本
    【echart】学习笔记
    【Django】url传递参数
    【HTML】section
    【jquery】获取元素高度
    【ztree】ztree例子
    【CSS3】块级元素与行内元素的区别
    Vue 项目中应用
    Vue 指令
    Vue 组件
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/8505209.html
Copyright © 2020-2023  润新知