为什么setattr(super(),…)不等同于super?

2024-06-10 05:11:26 发布

您现在位置:Python中文网/ 问答频道 /正文

根据this answer

setattr(instance, name, value) is syntactic sugar for instance.__setattr__(name, value)

但是:

class C:
    def __init__(self):
        # OK.
        super().__setattr__("foo", 123)

        # AttributeError: 'super' object has no attribute 'foo'
        setattr(super(), "foo", 123)

c = C()

什么给予?他们不应该做同样的事情吗?在


Tags: instanceanswernameforfooinitisvalue
1条回答
网友
1楼 · 发布于 2024-06-10 05:11:26

你提到的答案掩盖了一些重要的细节。长话短说,setattr绕过了super的魔力,因此它试图在super()代理对象本身上设置属性,而不是在self上设置属性。在


setattr(a, b, c)不是a.__setattr__(b, c)的语法糖。^仔细搜索类型和

相反,a.__setattr__(b, c)只是对__setattr__执行常规的属性查找,所以它要经过__getattribute__和{},并且它检查实例dict,除非{}说不。在


super实现一个自定义的__getattribute__方法来实现其属性魔术。super().__setattr__使用这个钩子,查找C的超类__setattr__并绑定{},从而产生一个方法对象来设置self上的属性。在

setattr(super(), ...)绕过__getattribute__。它执行前面提到的直接MRO搜索,通过super的MRO进行搜索,得到一个方法对象,用于在超级实例本身上设置属性。super实例没有存储任意属性数据的__dict__,因此尝试设置foo属性失败,并返回一个TypeError。在

相关问题 更多 >