2024-06-25 06:32:43 发布
网友
给定类A(我无权访问)的对象foo(我有权访问)
A
foo
foo有一个属性x,可以被许多也可以设置foo.x的参与方访问
foo.x
有没有可能把foo.x替换成@property这样的赋值
@property
foo.x = "bar"
从此以后会调用我指定的函数吗?如果是这样的话,以后是否也可以删除此属性并用类似于foo.x = "not a property"的内容再次替换它
foo.x = "not a property"
请考虑:我不能访问类,只能访问对象
你不能把属性放在一个实例上,不。你必须给这个类打补丁,或者给它子类化
Monkey修补需要您使用不同的名称将原始属性存储在实例的某个位置:
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属性值。这将确保现有实例继续工作
property
_x
__dict__
x
删除属性与删除属性一样简单:
del type(foo).x
请注意,此将与类属性冲突(例如,如果type(foo).x是现有对象)
type(foo).x
你不能把属性放在一个实例上,不。你必须给这个类打补丁,或者给它子类化
Monkey修补需要您使用不同的名称将原始属性存储在实例的某个位置:
这将设置类上的
property
对象。现在该类的所有实例都将具有该属性!为了解决这个问题,如果不存在_x
属性,那么上面的getter会退回到尝试从实例__dict__
获取原始的x
属性值。这将确保现有实例继续工作删除属性与删除属性一样简单:
请注意,此将与类属性冲突(例如,如果
type(foo).x
是现有对象)相关问题 更多 >
编程相关推荐