Python“ __ setattr__”和“ __getattribute__”的混淆

时间:2019-02-04 16:04:33

标签: python python-internals

此代码有什么问题?

-Dspring.profiles.active=customer

但是上面的代码无法打印任何内容。这是怎么了,有人可以帮我理解吗?我在https://rszalski.github.io/magicmethods/#access

中了解了这些方法

1 个答案:

答案 0 :(得分:3)

  

但是上面的代码无法打印任何内容

错了。它以无限递归崩溃。

__getattribute__中,当您想记录/拦截该调用时,在某些时候您仍然想要获取用于获取属性的原始方法。并且self.__dict__[name]会调用__getattribute__,因此这不是正确的方法。

您尝试的方法再次调用此方法,您将获得无限递归。而是调用父/基方法:

# interceptor to allows me to define rules for whenever an attribute's value is accessed
def __getattribute__(self, name):
    return object.__getattribute__(self,name)  # or super(Spam,self).__getattribute__(name)

打印:

11
21
Deprecated
None

None__getattr__返回(因为它只是打印到控制台并隐式返回None)。也许例外是一个更好的主意。