gpt4 book ai didi

python - 为对象实例定义属性

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:16 25 4
gpt4 key购买 nike

给定 A 类(我无权访问)的对象 foo(我有权访问)。

foo 有一个属性 x,它可以被很多人访问,也可以设置 foo.x

是否有可能用 @property 替换 foo.x - 像这样的赋值

foo.x = "bar"

以后会调用我指定的函数吗?如果是这样,是否也可以在之后删除此属性并将其替换为例如 foo.x = "not a property" 之类的东西?

请考虑:我无权访问类,只能访问对象。

最佳答案

您不能将属性放在实例上,不。您将不得不对类进行猴子修补,或者将其子类化。

Monkey-patching 将要求您使用不同的名称将原始属性存储在实例的某处:

def getter(self):
try:
return self._x
except AttributeError:
# access the attribute on the instance directly.
try:
return self.__dict__['x']
except KeyError:
raise AttributeError('x')

def setter(self, value):
self._x = value

foo._x = foo.x
type(foo).x = property(getter, setter)

这会在类上设置property 对象。现在该类的所有实例都将具有该属性!为了解决这个问题,如果没有 _x 属性,上面的 getter 会回退到尝试从实例 __dict__ 中获取原始的 x 属性值.这应确保现有实例继续工作。

删除属性就像删除它一样简单:

del type(foo).x

请注意,这属性冲突(例如,如果type(foo).x 是一个现有对象)。

关于python - 为对象实例定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35575443/

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