假设有一些课程:
class Test():
pass
mro()调用类实例化,其结果存储在__mro__中。
好吧,这对我来说还是很清楚的,因为在__mro__中有一些东西是真正存储的:
Test.__mro__
Out[48]: (__main__.Test, object)再一次,某处我读到了以下内容:
要查找属性名称,Python搜索: (A)在C‘s
__dict__的__mro__上搜索所有元类的__mro__。 B)如果在步骤a中找到数据描述符,则调用其__get__()并退出。 否则,调用描述符或在C自己的__dict__上返回类的__mro__中的值。 D)调用步骤a中找到的非数据描述符。 (E)否则,返回元类树值。
我可以发现在__mro__中没有Test.__dict__
'__mro__' in Test.__dict__
Out[49]: False因此,对于前面引号中的e子句,我想__mro__应该从“元树值”中提取,因此应该从type.__dict__中提取。
真的,在__mro__中有type.__dict__
["mro:<method 'mro' of 'type' objects>",
"__mro__:<member '__mro__' of 'type' objects>"]mro()的__mro__属性中的__mro__结果的内容实际上并不是这样的?<member '__mro__' of 'type' objects>对(__main__.Test, object)的结果如何也许您可以展示一些源代码来了解当我调用Test.__mro__时发生了什么。
发布于 2020-08-12 11:45:32
__mro__“属性”是一个数据描述符,类似于property。描述符没有从__mro__属性值中获取__dict__属性值,而是从另一个地方获取或计算该值。具体而言,<member '...' of '..' objects>表示从VM(内部位置)获取值的描述符--这是同一个__slots__。
>>> class Bar:
... __slots__ = "foo",
...
>>> Bar.foo
<member 'foo' of 'Bar' objects>
>>> 'foo' in Bar.__dict__
True描述符是在没有重复的情况下继承的,因此不会显式地出现在子类上。
>>> class Foo(Bar):
... __slots__ = ()
...
>>> Foo.foo
<member 'foo' of 'Bar' objects>
>>> 'foo' in Foo.__dict__
False这种member数据描述符的精确工作是定义的。但是,从逻辑上讲,它们与使用内部存储的property一样工作:
class FooBar:
def __init__(self, foo, bar):
# attributes stored internally
# the "_data" of a member is not visible
self._data = [foo, bar]
@property
def foo(self):
return self._data[0]
@foo.setter
def foo(self, value):
self._data[0] = value
@property
def bar(self):
return self._data[1]
@bar.setter
def bar(self, value):
self._data[1] = valuehttps://stackoverflow.com/questions/63374826
复制相似问题