我是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)
我认为attrs不仅可以存储变量,还可以存储方法。如果它这样做,这本词典中的关键词和值是什么?
答案 0 :(得分:0)
类的所有属性确实存储在字典中。请注意,方法只是属性;他们恰巧可以骂。 Python在很多地方使用字典;例如,模块的全局命名空间也是字典。 object.__getattribute__
hook的工作通常是将属性访问转换为属性字典中的键查找。
类声明的主体像函数一样执行,然后将生成的本地命名空间(通过调用locals()
生成的字典)传递给元类以生成类对象。这就是attrs
在示例代码中绑定的内容。
请参阅class
statement reference documentation:
然后在新的执行框架中执行类的套件(参见[命名和绑定](然后使用新创建的本地命名空间和原始全局框架,在新的执行框架中执行类的套件(请参阅命名和绑定)) namespace。(通常,套件主要包含函数定义。)当类的套件完成执行时,它的执行帧被丢弃但其本地命名空间被保存。然后使用继承列表创建一个类对象基类和属性字典的保存本地名称空间。
大胆强调我的。
您可以在Metaclasses section of the datamodel documentation中找到更多详情;引用Creating the class object section:
通过执行类主体填充类命名空间后,通过调用
创建类对象metaclass(name, bases, namespace, **kwds)
然后,type.__new__()
将命名空间字典附加到新创建的类对象。
datamodel documentation也涵盖了自定义类部分:
类具有由字典对象实现的命名空间。类属性引用被转换为此字典中的查找,例如,
C.x
被转换为C.__dict__["x"]
(尽管有许多钩子允许其他方法来定位属性)。
您也可以阅读descriptors;方法是通过将类命名空间中的函数绑定到查找方法名称的实例来创建的。