美文网首页
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初探

    要理解python中的元类的概念,首先要清楚类的概念。首先,python中类是对象,当用class关键字声明的时候...

  • Python Metaclass 初探

    先以一个大牛的一段关于Python Metapgramming的著名的话来做开头: Metaclasses are...

  • isa与meta class

    isa 类的实例对象-》class-〉metaclass metaclass 》root meta class r...

  • 面试常考(python)

    Python语言特性 1.Python的函数参数传递 2.元类 metaclass metaclass 允许创建类...

  • metaclass

    本文来自stackoverflow 类也是对象 没错,python中一切皆对象,类也是对象。我们来证明一下 每当你...

  • metaclass

    深刻理解Python中的元类(metaclass) - 文章 - 伯乐在线

  • 一文搞懂什么是Python的metaclass

    Python 有很多黑魔法,为了不分你的心,今天只讲 metaclass。对于 metaclass 这种特性,有两...

  • Python3中的构建元类

    class Foo(metaclass=funtion): pass

  • 学习历程(然而还是面不过)

    学而不思则罔,思而不学则殆。正如学习了 MetaClass,却不思考苹果为何要设计MetaClass 好记性不如烂...

  • 彻底理解python3 metaclass

    A metaclass is a class whose instances are classes. Like ...

网友评论

      本文标题:metaclass初探

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