什么是元类?
元类就是创建类的类,type是最原始的一个元类。(实例是实例化的类,而类是元类的实例)
python中一切皆为对象,所有的类都直接和间接的是type类的实例对象。
另外,我们知道object是所有类的父类,同时object又是type类的实例对象。元类中的特殊方法
__new__(cls,name,base,attr)
元类中, __new__ 是用来生成类的,只会调用一次
__init__(self, name, *args, **kwargs)
该元类的实例(也就是普通类)创建后被调用,用于为初始化实例的,只会调用一次
__call__(self, *args, **kwargs)
元类创建的实例(也就是普通类),构造普通类的对象时调用,每次都会执行
- 元类如何创建类
在元类中是通过 __new__ 函数生成类的, 该函数是静态函数。
1. type(类名称[str], 父类[()],类的属性/函数[dict])
# 创建临时类
2. type.__new__(元类[type], 类名称[str], 父类[()],类的属性/函数[dict])
- 如何自定义元类?
# python3
class XXType(type): # 自定义元类必须要显式继承type类
pass
class XXClass(metaclass=XXType): # 设置类的元类
pass
# python2
# 设定 __metaclass__
- 在单例模式中的应用
import threading
# 创建类时,type的init方法自动执行,类() 执行type的call方法(这个方法中会依次执行类的new、init方法
class SingletonType(type):
_instance_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
with SingletonType._instance_lock:
if not hasattr(cls, "_instance"):
cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(metaclass=SingletonType):
def __init__(self):
print(1)
# 创建对象时,类的init方法自动执行,对象() 执行类的call方法
obj = Foo()