定义对象实例的属性

2024-06-25 06:32:43 发布

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

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

foo有一个属性x,可以被许多也可以设置foo.x的参与方访问

有没有可能把foo.x替换成@property这样的赋值

foo.x = "bar"

从此以后会调用我指定的函数吗?如果是这样的话,以后是否也可以删除此属性并用类似于foo.x = "not a property"的内容再次替换它

请考虑:我不能访问类,只能访问对象


Tags: 对象函数内容属性foonotbarproperty
1条回答
网友
1楼 · 发布于 2024-06-25 06:32:43

你不能把属性放在一个实例上,不。你必须给这个类打补丁,或者给它子类化

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属性值。这将确保现有实例继续工作

删除属性与删除属性一样简单:

del type(foo).x

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

相关问题 更多 >