什么';python中dict和ATTR之间的关系?

什么';python中dict和ATTR之间的关系?,python,dictionary,orm,metaclass,Python,Dictionary,Orm,Metaclass,我是python的初学者。我正在学习元类,但我不太明白字典是如何存储方法和属性的 class ModelMetaclass(type): def __new__(cls, name, bases, attrs): if name=='Model': return type.__new__(cls, name, bases, attrs) print('Found model: %s' % name) mappings

我是python的初学者。我正在学习元类,但我不太明白字典是如何存储方法和属性的

class ModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        if name=='Model':
            return type.__new__(cls, name, bases, attrs)
        print('Found model: %s' % name)
        mappings = dict()
        for k, v in attrs.items():
            if isinstance(v, Field):
                print('Found mapping: %s ==> %s' % (k, v))
                mappings[k] = v
        for k in mappings.keys():
            attrs.pop(k)
        attrs['__mappings__'] = mappings
        attrs['__table__'] = name 
        return type.__new__(cls, name, bases, attrs)

我假设attr不仅可以存储变量,还可以存储方法。如果它这样做了,那么这个字典中的键和值是什么,attrs

类的所有属性实际上都存储在字典中。注意,方法也只是属性;他们只是碰巧可以打电话。Python在很多地方使用字典;例如,模块的全局名称空间也是一个字典。将属性访问转换为属性字典中的键查找通常是的工作

class语句的主体像函数一样执行,然后将生成的本地名称空间(通过调用生成的字典)交给元类以生成class对象。这就是示例代码中绑定到的
attrs

见:

然后,使用新创建的本地命名空间和原始全局命名空间,在新的执行框架中执行类的套件(请参见[命名和绑定])(然后在新的执行框架中执行类的套件(请参见命名和绑定)。(通常,套件主要包含函数定义。)当类的套件完成执行时,其执行帧将被丢弃,但其本地名称空间将被保存。然后使用基类的继承列表和属性字典保存的本地名称空间创建类对象

我的

您可以在“引用以下内容”中找到更多详细信息:

一旦通过执行类主体填充了类名称空间,则通过调用
元类(名称、基、名称空间、**kwds)

然后通过
类型将名称空间字典附加到新创建的类对象上

在“自定义类”部分下,也介绍了这一点:

一个类有一个由dictionary对象实现的名称空间。类属性引用被转换为该字典中的查找,例如,
C.x
被转换为
C.\uu dict\uuuu[“x”]
(尽管有许多钩子允许其他定位属性的方法)


您可能还需要阅读;方法是通过将类命名空间中的函数绑定到查找方法名称的实例来创建的。

方法只是可调用的属性。对象属性通常存储在名为
\uuuu dict\uuuu
的字典中(也是一个属性,通过称为“slots”的机制)。如果您是初学者,可以暂时安全地忽略元类。顺便说一句,将“attributes”缩写为“attrs”可能会造成混淆,因为有一个流行的Python库称为