zoukankan      html  css  js  c++  java
  • 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 得票最高那个答案写的非常好

  • 相关阅读:
    javascript Date类的扩展
    软件工程师好了歌 (转)
    您可能不知道的.Net2.0小技巧
    您未必知道的Js技巧
    复活吧,架构师!
    技巧系列文章
    不要使用paddingtop控制内容开始的位置
    JQuery Offset实验与应用(转载)
    2008最佳Windows应用程序
    精选15个国外CSS框架
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/8505209.html
Copyright © 2011-2022 走看看