Loading... > metaclass很重要! 用它来实现单例: > > 这里需要注意几个关键点: ``` 1. 元类可被继承 - 继承type的类就是元类 2. 元类影响子子孙孙 - 任何类只要指定了metaclass A, 那么他的子子孙孙的元类都是A 3. metaclass 是python的内置变量, 声明在module中, 则对全module生效, 同理声明在类中, 则对该类生效 4. 示例代码MyType中 ,__call__在实例化类对象的时候, 需要调用super, 否则递归死循环报错, 我想应该这里很容易理解; ``` ```python # Note: 利用元类实现单例模式 class MyTpye(type): # Note: 元类的new 和 init是在class Foo定义时触发, 用来构建Foo类到内存 def __init__(cls, name, bases, attrs): cls.instance = None super().__init__(name, bases, attrs) def __new__(mcs, *args, **kwargs): new_cls = super().__new__(mcs, *args, **kwargs) return new_cls # Foo类加括号后触发, super.__call__ 调用 自己那个类Foo的 __new__ 和 __init__, 实例化了一个对象 def __call__(cls, *args, **kwargs): if not cls.instance: instance = super().__call__(*args, **kwargs) cls.instance = instance return cls.instance class Singleton(object, metaclass=MyTpye): pass class Foo(Singleton): def __init__(self, name): self.name = name f1 = Foo('xiao') f2 = Foo('hua') print(Foo.instance) print(f1, f1.name) print(f2, f2.name) ``` © 允许规范转载