Python 如何解释';怪异';关于uuu getattribute uuu、uuu getattr uuu的结果?
B类的定义如上所述,接下来我尝试做一些关于Python 如何解释';怪异';关于uuu getattribute uuu、uuu getattr uuu的结果?,python,Python,B类的定义如上所述,接下来我尝试做一些关于\uuuuuu getattr\uuuuuuuuuu、\uuuuuuuuu getattribute\uuuuuuuu的测试: class B(object): """new style class""" def __getattribute__(self, name): print '__getattribute__ called' return super(B, self).__getattribute__(
\uuuuuu getattr\uuuuuuuuuu、\uuuuuuuuu getattribute\uuuuuuuu
的测试:
class B(object):
"""new style class"""
def __getattribute__(self, name):
print '__getattribute__ called'
return super(B, self).__getattribute__(name)
def __getattr__(self, name):
print '__getattr__ called'
def __setattr__(self, name, value):
print '__setattr__ called'
if name in ['forbid', 'refuse']:
raise AttributeError('Attribute name invalid!')
else:
return super(B, self).__setattr__(name, value)
最后的结果是:
b = B()
setattr(b, 'test', 100)
print b.__dict__
print b.__getattribute__('__dict__')
print b.__getattr__('__dict__')
print getattr(b, '__dict__')
我的问题来了:
1.打印b.\uuuuu getattribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
2.打印b.\uuuuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?为什么不返回
上面的结果对我来说太奇怪了。我真的不明白这些方法是如何工作的。任何建议都非常感谢。谢谢
第一个\uuuuu getattribute\uuuu
调用在执行b.\uuuu getattribute\uuuu
时完成。你想得到一个名为\uuuu getattribute\uuuu
的属性(是的,我知道这听起来很复杂)。当您请求名为\uuuuuu getattribute\uuuuu
的属性时,将调用\uuuuuu getattribute\uuuuu
并在结果中获得\uuu getattribute\uuuuu
方法。然后您只需调用\uuuuuu getattribute\uuuu
方法-这里是\uuuuu getattribute\uuuu
的第二个调用
b.。\uuuuuGetAttr\uuuuuuuuuuuuuuu
调用\uuuuuuuuGetAttr\uuuuuuuuuuuuuuuuuuu
(是的,我知道)。您将得到\uu getattr\uu
方法作为回报。然后调用\uu getattr\uu
方法。它不会显式返回任何内容,这意味着它不会隐式返回任何内容
以下是当您看到类的某些对象时发生的简化版本。某些方法()
:
- 调用
\uuuu getattribute\uuu
以获取名为some\u method
的属性<代码>\uuuu getattribute\uuuu
打印“我被呼叫!”并将其任务委托给对象。
(我认为,它检查类B的一些对象\uu dict\uuuu
,检查其类\uu dict\uuuu
,基类\uu dict\uuuu
,处理描述符等。希望对象。返回一些方法(希望是一个函数,或者更准确地说是一个绑定方法)
调用此函数/绑定方法。在您的示例中,绑定方法是\uuu getattribute\uuu
本身。这就是它调用两次的原因
对于第二季度,\uuuuuu getattr\uuuuuu
负责返回无
;它所做的一切就是打印
。对于第一季度,\uuuuuu getattribute\uuuuuuuuu
被调用来解析\uuuu getattribute\uuuuuuuuuuuuuu
!@jornsharpe Q2,在调用\uuuuuuuuu getattr\uu
之前,\uuuuuuuu getattribute的代码在哪里\uuuuuu getattribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,和b.\uuuu getattribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!我明白了:)@Nigel tufnel根据我上面的评论,例如b.\uu getattribute\uuuu()
是b.\uu getattribute\uuuu(“\uu getattribute\uuuuu”)()
__getattribute__ called
{'test': 100}
__getattribute__ called
__getattribute__ called
{'test': 100}
__getattribute__ called
__getattr__ called
None
__getattribute__ called
{'test': 100}