元类:控制类行为的类
一个类定义了类实例(对象)的行为,一个元类定义了一个类的行为。
python提倡任何东西皆为对象,因此类可以看作是元类的实例。
一个类的行为可以借助一个函数来改变,那为什么要用元类呢?
原因1、语义更清晰明确。当你读SingletonMetaclass(type)时一眼便看出其意义之所在;
原因2、可以方便使用OOP编程思想。元类可以继承元类,可以扩展元类的方法,因此容易实现继承和多态等特性;
原因3、使得代码easier to read。可以更好的结构化代码;
原因4、容易下钩子。可以在魔术方法__new__
, __init__
和__call__里面植入钩子,干一些微妙的事情。
The main use case for a metaclass is creating an API.
常见的使用情况是实现单例模式。
class Singleton(type):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__instance = None
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super().__call__(*args, **kwargs)
return self.__instance
else:
return self.__instance
class Spam(metaclass=Singleton):
def __init__(self):
print("Creating a single Spam")
if __name__ == "__main__":
a = Spam()
b = Spam()
c = Spam()
a is b
a is c
#output
a = Spam()
Creating a single Spam
b = Spam()
c = Spam()
a is b
Out[5]: True
a is c
Out[6]: True