当我说python 属性查找过程"时,我的意思是:当你编写 x.foo 时,python 做了什么??
When i say "python attribute lookup proccess" i mean: what python does when you write x.foo??
在网上搜索我没有找到太多关于此的文档,我发现的最好的论文之一将过程恢复到以下步骤(你可以看到完整的文章 这里)
Searching the web i didn't found to much docs about this, one of the best papers i found resumed the proccess to the following steps (you can see the full article here)
起初这似乎是正确的,但属性查找过程有点复杂,例如对于 x.foo,如果 x 是类或实例,它的行为就不一样了.
At first this might seem right, but the attribute lookup process is a little bit more complicated, for example for x.foo, it doesn't behave the same if x is a class or an instance.
我发现了一些无法通过这种方式解释的示例.考虑以下 python 代码:
I have a found some samples that can't be explained by this way. Consider the following python code:
class Meta(type):
def __getattribute__(self, name):
print("Metaclass getattribute invoked:", self)
return type.__getattribute__(self, name)
def __getattr__(self, item):
print('Metaclass getattr invoked: ', item)
return None
class C(object, metaclass=Meta):
def __getattribute__(self, name):
print("Class getattribute invoked:", args)
return object.__getattribute__(self, name)
c=C()
现在检查以下行与相应的输出:
Now check the following lines with the corresponding output:
>> C.__new__
Metaclass getattribute invoked: <class '__main__.C'>
<built-in method __new__ of type object at 0x1E1B80B0>
>> C.__getattribute__
Metaclass getattribute invoked: <class '__main__.C'>
<function __getattribute__ at 0x01457F18>
>> C.xyz
Metaclass getattribute invoked: <class '__main__.C'>
Metaclass getattr invoked: xyz
None
>> c.__new__
Class getattribute invoked: (<__main__.C object at 0x013E7550>, '__new__')
<built-in method __new__ of type object at 0x1E1B80B0>
>> c.__getattribute__
Class getattribute invoked: (<__main__.C object at 0x01438DB0>, '__getattribute__')
Metaclass getattribute invoked: <class '__main__.C'>
<bound method C.__getattribute__ of <__main__.C object at 0x01438DB0>>
>>
我的结论是(考虑到我们正在搜索 x.foo):
The conclusions i have been are (considering we're searching for x.foo):
有人可以解释一下吗?或者告诉我在哪里可以找到有关此的文档,谢谢.
Can someone explain this please?? or at less tell me where can i find some documentation about this, thanks.
如果你添加了 print("Metaclass getattribute invoked:", self, name)
你会看到:
If you added print("Metaclass getattribute invoked:", self, name)
you'd see:
>>> c.__getattribute__
Class getattribute invoked: <__main__.C object at 0x2acdbb1430d0> __getattribute__
Metaclass getattribute invoked: <class '__main__.C'> __name__
<bound method C.__getattribute__ of <__main__.C object at 0x2acdbb1430d0>>
元类 __getattribute__
被调用以构建表达式 c.__getattribute__
的 repr
,以便它可以打印 C
的 __name__
.
The metaclass __getattribute__
is getting invoked in order to build the repr
of the expression c.__getattribute__
, so that it can print C
's __name__
.
btw,__getattribute__
对类和元类的作用相同;首先在实例上查找属性,然后在实例的类型上查找.
btw, __getattribute__
works the same for classes and metaclasses; the attribute is looked up first on the instance then on the instance's type.
>>> Meta.foo = 1
>>> C.foo
('Metaclass getattribute invoked:', <class '__main__.C'>, 'foo')
1
>>> c.foo
('Class getattribute invoked:', <__main__.C object at 0x2acdbb1430d0>, 'foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getattribute__
AttributeError: 'C' object has no attribute 'foo'
>>> C.bar = 2
>>> c.bar
('Class getattribute invoked:', <__main__.C object at 0x2acdbb1430d0>, 'bar')
2
这篇关于python属性查找过程如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!