Python 元类是否首先实例化类的属性?

Python 元类是否首先实例化类的属性?,python,python-2.7,metaclass,Python,Python 2.7,Metaclass,从到什么是元类?我明白了: 您首先编写类Fooobject,但尚未在内存中创建类对象Foo Python将在类定义中查找元类。如果找到它,它将使用它来创建对象类Foo。如果没有,它将使用type来创建类 经过测试,类的属性似乎是在类的构造函数运行之前实例化的。我误解了什么 测试代码: class meta(type): def __init__(cls, name, bases, dic): type.__init__(cls, name, bases, dic)

从到什么是元类?我明白了:

您首先编写类Fooobject,但尚未在内存中创建类对象Foo

Python将在类定义中查找元类。如果找到它,它将使用它来创建对象类Foo。如果没有,它将使用type来创建类

经过测试,类的属性似乎是在类的构造函数运行之前实例化的。我误解了什么

测试代码:

class meta(type):

    def __init__(cls, name, bases, dic):
        type.__init__(cls, name, bases, dic)

        print hasattr(cls, "a")
        cls.a = "1"


class A(object):
    a = "a"
    __metaclass__ = meta


class B(object):
    __metaclass__ = meta


class C(object):
    __metaclass__ = meta
    a = "a"


print A.a
print B.a
print C.a
输出:

True
False
True
1
1
1

类主体在构建类之前运行,是的

类的主体提供了一个临时名称空间,该名称空间中的所有本地名称都作为字典提供,以构造类对象,以及基类和类的名称

您也可以使用类型构造函数执行此操作:

>>> Foo = type('Foo', (), {'a': 1})
>>> Foo.a
1
类主体基本上是作为函数执行的,该函数的本地名称空间用于创建类属性,这是上面要键入的第三个参数

在Python3中,元类对该过程的影响更大一些__prepare_uu;应该是一个类方法,它返回类主体的初始名称空间;在执行类主体之前,使用它向生成的类主体中注入额外的名称:

class MyMeta(type):
   @classmethod
   def __prepare__(mcl, name, bases):
       return {'a': 1}

类主体在构建类之前运行,是的

类的主体提供了一个临时名称空间,该名称空间中的所有本地名称都作为字典提供,以构造类对象,以及基类和类的名称

您也可以使用类型构造函数执行此操作:

>>> Foo = type('Foo', (), {'a': 1})
>>> Foo.a
1
类主体基本上是作为函数执行的,该函数的本地名称空间用于创建类属性,这是上面要键入的第三个参数

在Python3中,元类对该过程的影响更大一些__prepare_uu;应该是一个类方法,它返回类主体的初始名称空间;在执行类主体之前,使用它向生成的类主体中注入额外的名称:

class MyMeta(type):
   @classmethod
   def __prepare__(mcl, name, bases):
       return {'a': 1}