美文网首页
python元类和三个对象概念

python元类和三个对象概念

作者: LittleTrue | 来源:发表于2018-10-04 23:52 被阅读0次

    在python中,关于对象权威的说法是metaclasses,classes,instance三类对象
    python中的类,本质上也是一个对象,type就是元类, 除了检测类型的功能外, 也是创建类的类(另外还有创建抽象类的元类ABCmeta)。

    python通过type()函数创建类

    type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)...的定义:

    要创建一个class对象,type()函数依次传入3个参数:

    • class的名称;
    • 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
    • class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

    通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。


    metaclass自定义元类

    metaclass,直译为元类,简单的解释就是:

    当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。
    但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass元类,然后创建类。
    连接起来就是:_______
    先定义metaclass元类,就可以创建类,最后创建实例。

    遵循上面的三部曲, 首先先定义metaclass元类:
    # metaclass是创建类,所以必须从`type`类型派生:
    class ListMetaclass(type):
        def __new__(cls, name, bases, attrs):
            attrs['add'] = lambda self, value: self.append(value)
            return type.__new__(cls, name, bases, attrs)
    
    注意:

    __new__()方法接收到的参数依次是:

    • 当前准备创建的类的对象;
    • 类的名字;
    • 类继承的父类集合;
    • 类的方法集合。
    然后创建类
    class MyList(list):
        __metaclass__ = ListMetaclass # 指示使用ListMetaclass来定制类
    
    然后实例化对象
    #可以正常调用add
    L = MyList()
    L.add(1)  
    

    相关文章

      网友评论

          本文标题:python元类和三个对象概念

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