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 得票最高那个答案写的非常好

原文地址:https://www.cnblogs.com/tianqizhi/p/8505209.html