Python 如何解释';怪异';关于uuu getattribute uuu、uuu getattr uuu的结果?

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__(

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__(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}