为什么 str() 不使用 __getattribute__ 来获取 __str__ 以及如何产生效果?

Red*_*ite 3 python python-datamodel python-3.x getattribute

当我调用str()具有重载__getattribute__方法的对象时,它似乎没有使用它,而是__str__直接调用。是否有其他一些我应该修改的功能或让它使用的方法__getattribute__?如果我__str__直接超载它会按预期运行,但这并不适合我的需求。

class A(object):
    def __getattribute__(self, attr):
        if attr == "__str__":
            return lambda: "Hello"
        return object.__getattribute__(self, attr)

x = A()

print(x)
print(str(x))
print(x.__str__())
Run Code Online (Sandbox Code Playgroud)

输出:
< main .A object at 0x000001FDF7AEA760>
< main .A object at 0x000001FDF7AEA760>
Hello

期望输出:
你好
你好
你好

jua*_*aga 5

是的,这是记录在案的行为

作为通过语言语法或内置函数进行隐式调用的结果,在查找特殊方法时仍可能绕过此方法。

在这里

对于自定义类,特殊方法的隐式调用只有在对象类型上定义时才能保证正常工作,而不是在对象的实例字典中

...

除了为了正确性而绕过任何实例属性之外,隐式特殊方法查找通常也会绕过__getattribute__()对象的元类的方法......

...

至于为什么

__getattribute__()以这种方式绕过机制为解释器中的速度优化提供了很大的空间,代价是处理特殊方法的一些灵活性(特殊方法必须在类对象本身上设置,以便解释器始终如一地调用) .