gpt4 book ai didi

Python 2.7 : What does object. __setattr__ 在后台做什么?

转载 作者:行者123 更新时间:2023-11-28 21:41:22 25 4
gpt4 key购买 nike

在 Python 2.7 中,我可以声明一个新式类并使用 object.__setattr__ 设置一个属性:

class A (object):
def __init__ (self):
object.__setattr__(self, 'foo', 'bar')

A().foo # 'bar'

但是,这在旧式类中不起作用:

class B:
def __init__ (self):
object.__setattr__(self, 'foo', 'bar')

B().foo

TypeError: can't apply this __setattr__ to instance object

我知道旧式类不支持这种行为,但我不知道为什么它不起作用。

当我在旧式类中不能发生的新式类上调用 object.__setattr__ 时,底层发生了什么?

请注意,我没有将此代码用于任何用途,我只是想了解它。

最佳答案

object.__setattr__ 方法包括一个特定的检查以确保传入的 self 确实是对象(或重用相同 C 的另一个对象)的(子类)直接运行)。该测试不允许传入任何其他内容,包括旧式实例。

检查是为了防止 object.__setattr__ 被用来修改内置类型(被称为 Carlo Verre hack,之后它的发现者。

如果没有显式检查(或者如果你编译 Python 以禁用它),你可以这样做:

>>> object.__setattr__(str, 'lower', str.upper)
>>> "This is why we can't have nice things".lower()
"THIS IS WHY WE CAN'T HAVE NICE THINGS"

参见 hackcheck() function , 和 original Python-dev discussion .

老式的实例对象没有通过测试只是一个副作用。

请注意,您想要调用 object.__setattr__唯一原因是您有一个实现了 __setattr__ 的基类你需要绕过的方法。对于旧式实例,您可以只使用 self.__dict__[name] = value 代替。

关于Python 2.7 : What does object. __setattr__ 在后台做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44854330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com