美文网首页
python语言之四:元类

python语言之四:元类

作者: Wu杰语 | 来源:发表于2018-06-24 16:44 被阅读0次

按照一般的语言,需要掌握的有类型、控制语句、函数,如果是面向对象,则需要掌握面向对象的部分。每个语言有每个语言的特性,对于python来讲,迭代器、装饰器、元类是这个语言的特有的特征,也是需要掌握的。
对于元类,只需要知道它就可以了,不需要太深入,为啥,因为元类,不是一般的去写解释器之类的,真的用的极少,而且难以理解。所以我们的学习目标就是知道它就可以了。

元类

首先我们需要知道python中的类本身也是一个对象,在定义一个类的时候,就会在内存中创建一个名字为类名的对象。

类和元类的区别是,类是从object继承的,而元类是从type继承的。所以google的python编码规范中规定,如果写类,默认情况下写上从object继承。

一个元类的例子:

class Meta(type):
    def __new__(cls, name, bases, dct):
        print("calling Meta's __new__", cls)
        return type.__new__(cls, name, bases, dct)

    def __call__(cls, *args, **kwargs):
        print("calling Meta's __call__", cls)
        i = object.__new__(cls)
        i.__init__(*args, **kwargs)
        return i

可以看到new方法实际上返回一个类,不是一个实例,注意。

实现:

class myclass(metaclass=Meta):
    def __init__(self):
        ...
    def __new__(self):
        ...

实现类继承,metaclass=Meta,当
a = myclass()
python解释器工作了,不是直接掉myclass的new,而是先调meta中的new(),返回myclass这个类,接着Meta中的call声明会拦截myclass的new init方法,除非在call中显示的调用,这两个方法就不会再调用。

用途

能操作类,自然是很厉害,最简单的用途就是sigleton的实现:

class SingletonMeta(type):
    def __init__(cls, name, bases, namespaces):
        super().__init__(cls, name, bases, namespaces)
        cls.instance = None
    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__call__(*args, **kwargs)
        else:
            print("instance already existed!")
        return cls.instance

class Singleton(meta=Singleton):
    pass

相关文章

  • python语言之四:元类

    按照一般的语言,需要掌握的有类型、控制语句、函数,如果是面向对象,则需要掌握面向对象的部分。每个语言有每个语言的特...

  • Python 进阶丨如何创建你的第一个 Python 元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。 Python元类设置类...

  • 10.元类

    元类的对象是类type是python的内建元类 自定义元类:

  • 29.Python之面向对象的元类

    Python之面向对象的元类 什么是元类?类的类就是元类,元类创建对象。使用class定义的类,用来产生程序员自己...

  • Python 元类

    什么是元类?元类就是创建类的类,type是最原始的一个元类。(实例是实例化的类,而类是元类的实例)python中一...

  • scala类与伴生类、单例

    类似python元类与apply方法类似python中call方法

  • python 元类

    转载 刘仲雨 两句话掌握python最难知识点——元类 千万不要被所谓“元类是99%的python程序员不会用到的...

  • python元类

    在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立类也是对象。但是,P...

  • Python元类

    类也是对象,在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得...

  • Python元类

    1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:...

网友评论

      本文标题:python语言之四:元类

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