Python - metaclass元类

1. 概念

1.1 MetaClass作用:用来指定当前类由谁来创建(默认type创建)

2. 如何用metaclass?

第一种为Python3, 第二种为Python2/3

    class Foo(metaclass=type):
        pass 
            
    class Foo(object):
        __metaclass__ = type

3. 例子

3.1 MyType('Base', (object,), {}) 是由MyType创建; metaclass=MyType
3.2 type可以创建类时,metaclass=type;MyType创建类时,metaclass=MyType
3.3 Base = MyType('Base', (object,), {}) 等价于 Base(metaclass=MyType)

# 自定义元类
class MyType(type):
    def __init__(self, *args, **kwargs):
        super(MyType, self).__init__(*args, **kwargs)

    def __call__(cls, *args, **kwargs):
        print('xxxx')
        return super(MyType, cls).__call__(*args, **kwargs)

# 用元类创建Base类,调用了元类的__call__
Base = MyType('Base', (object,), {})
Base()

print(Base)  #<class '__main__.Base'>
print(type(Base)) #<class '__main__.MyType'>

# Foo继承Base类,也是指向同一个元类
class Base(metaclass=MyType):
    pass
class Foo(Base):
    pass
obj = Foo()

结果

xxxx
<class '__main__.Base'>
<class '__main__.MyType'>
xxxx

猜你喜欢

转载自www.cnblogs.com/allen2333/p/9053133.html