美文网首页
metaclass初探

metaclass初探

作者: MontyOak | 来源:发表于2017-10-14 11:00 被阅读4次

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

    相关文章

      网友评论

          本文标题:metaclass初探

          本文链接:https://www.haomeiwen.com/subject/lsdxuxtx.html