metaclass初探
2017-10-14 本文已影响4人
MontyOak
要理解python
中的元类的概念,首先要清楚类的概念。
首先,python
中类是对象,当用class
关键字声明的时候,会创建出一个类,而这个类可以进一步创建出若干实例。
由于类本身也是对象,所以类也是可以被动态创建出来的。你应该会熟悉type
函数,它用于检测对象的类型。
class A(object):
pass
type(1)
# int
type('my demo')
# str
type(A)
# type
type(A())
# __main__.A
在这里,type
函数有了特殊的能力:接受类的描述作为参数,返回一个类。也就是说,动态创建一个类。
B = type('B', (object,), {'attr1': 1})
B
# __main__.B
B.attr1
# 1
B.__class__
# type
那到底什么是元类呢?元类就是用于创建类的东西。比如上面的type
,其实质是python
的内建元类,除了type
本身,用户还可以继承type
来自定义元类。
在类声明中显式声明__metaclass__
属性时,所有使用该类及该类的子类都会使用所设置的方法来指导类的生成。
举个例子,当声明类的时候class A(object)
,python
首先会在类定义(这里的类定义包含由下至上的命名空间查找顺序)中寻找__metaclass__
,若找到了就用它来创建类对象A,若没有找到则用type
方法来创建类。
现在搞明白了什么是元类,那元类都有什么用途呢?
用元类实现单例模式
class Singleton(object):
def __init__(cls, name, bases, dic):
super(Singleton, cls).__init__(name, bases, dic)
cls.instance = None
def __call__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.instance
class MySingleton(object):
__metaclass__ = Singleton
元类的主要目的就是在创建类的时候能够自定义的修改类。在API的创建时,通常会创建符合上下文的类。
元类本身只干了三件事:拦截类的创建、修改类、返回修改过之后的类。