# 元类(metaclass) type 就是产生类的类,是类的模板
class Foo:
pass
f1 = Foo()
print(type(f1)) # <class '__main__.Foo'>
print(type(Foo)) # <class 'type'>
# f1对象是Foo类的一个实例,Foo类是type类的一个实例
# 第二种方式定义类
def __init__(self, name, age):
self.name = name
self.age = age
FFo = type('FFo', (object,), {'x': 1, '__init__': __init__}) # 第一个参数是类名(字符串),第二个参数指继承的父类(元组),第三个参数为属性(字典)
print(FFo) # <class '__main__.FFo'>
print(
FFo.__dict__) # {'x': 1, '__init__': <function __init__ at 0x005A3FA8>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'FFo' objects>, '__weakref__': <attribute '__weakref__' of 'FFo' objects>, '__doc__': None}
f2 = FFo('张三', 18)
print(f2) # <__main__.FFo object at 0x01DF0770>
# 自定制元类
class MyType(type):
def __init__(self, a, b, c): # 这时需要4个参数,a代表传入的实例名Foo(Foo类是MyType类的一个实例),b代表实例继承的父类,c表示实例的属性字典
print('元类的构造函数执行')
def __call__(self, *args, **kwargs):
obj = object.__new__(self) # object.__new__(Foo)->f1 创建f1对象
self.__init__(obj, *args, **kwargs) # Foo.__init__(f1, *args, **kwargs) 执行Foo类中的__init__方法
return obj # 返回f1对象
class Foo(metaclass=MyType): # Foo = MyType(Foo, 'Foo', (), {})
def __init__(self, name):
self.name = name # f1.name = name
f1 = Foo('alex') # 实例化就触发__init__方法,()就触发__call__方法
print(f1.__dict__) # {'name': 'alex'}