Python 元类metaclass 和 基类(超类)object

import os


'''
Python 基类和元类
    - 看了那么多问答, 其实我还是晕的. 其实单纯看一个的话我是理解了, 但是两个放一起, 就懵了. 想的脑袋都疼
    - 基类 object:
        - python 类继承关系的顶端,  object.__bases__  它的继承为空(), 也就是它是所有类的爸爸或者爷爷..., 所有类以它为起点
        - 然后. Python一切皆对象, 所以 object 也是对象, 是对象就有实现类.
        - 所以: object.__class__  它的实现类是type   <class 'type'>
    - 元类(metaclass) type:
        - 单独来看, 元类挺简单的, 就是类工厂, 创建类的东西
        - 元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。
        - class关键字就是使用元类通过__new__和__init__创建出一个类
        - 元类的还有一个作用就是定义类型, 定义object(对象的类型)
        
    - 一起来看就很奇怪, 也是我没有理解的地方
        - object是type的实例
        - type继承object
        - type是type自己的实例
        
    - 代码:
        object.__class__
            <class 'type'>
        type.__class__
            <class 'type'>
        object.__bases__
            ()
        type.__bases__
            (<class 'object'>,)
'''



'''
stack over flow 关于元类的回答:

    元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。
    
    尽管在Python中您可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。
    type是Python中常见的元类。type它本身是一个类,并且是它自己的类型。您将无法type纯粹在Python中重新创建类似的内容,但是Python有点作弊。
    要在Python中创建自己的元类,您实际上只想将其子类化type。
    
    元类最常用作类工厂。当通过调用类创建对象时,Python通过调用元类来创建一个新类(当执行“ class”语句时)。
    因此,将元类与普通方法__init__和__new__方法结合使用,可以使您在创建类时做“额外的事情”,例如使用某些注册表注册新类或将其完全替换为其他类。
    
    当class执行语句时,Python首先将class语句的主体作为普通代码块执行。生成的名称空间(字典)保留了将来类的属性。通过查看要成为类的基类(继承了元类),
    要成为类的__metaclass__属性(如果有)或__metaclass__全局变量来确定元类。然后使用该类的名称,基数和属性调用该元类以实例化它。
    
    但是,元类实际上定义了一个类的类型,而不仅仅是它的工厂,因此您可以使用它们做更多的事情。
    例如,您可以在元类上定义常规方法。这些元类方法就像类方法,因为它们可以在没有实例的情况下在类上调用,但是它们也不像类方法,因为它们不能在类的实例上被调用。
    type.__subclasses__()是type元类上方法的示例。您还可以定义正常的“魔力”的方法,如__add__,__iter__和__getattr__,执行或如何变化的类的行为。
'''
posted @ 2020-12-28 14:45  道友请留步W  阅读(569)  评论(0编辑  收藏  举报