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的创建时,通常会创建符合上下文的类。
元类本身只干了三件事:拦截类的创建、修改类、返回修改过之后的类。

上一篇下一篇

猜你喜欢

热点阅读