Python 定义对象实例的属性

Python 定义对象实例的属性,python,properties,Python,Properties,给定一个foo(我有权访问)类A(我无权访问)的对象 foo有一个属性x,许多参与方都可以访问该属性,这些参与方也可以设置foo.x 是否有可能以某种方式将foo.x替换为@属性——例如 foo.x = "bar" 从那以后会调用我指定的函数吗?如果是这样,是否也可以在以后删除此属性并再次使用类似于foo.x=“nota property”的内容替换它 请考虑:我无权访问该类,只能访问该对象。您不能将属性放在实例上,不行。您必须对该类进行猴子补丁,或对其进行子类化 Monkey patchin

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

foo
有一个属性x,许多参与方都可以访问该属性,这些参与方也可以设置
foo.x

是否有可能以某种方式将
foo.x
替换为
@属性
——例如

foo.x = "bar"
从那以后会调用我指定的函数吗?如果是这样,是否也可以在以后删除此属性并再次使用类似于
foo.x=“nota 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)
这将设置类上的
属性
对象。现在该类的所有实例都将具有该属性!为了解决这个问题,如果没有
\ux
属性,上面的getter会返回到尝试从实例
\uu dict\uuu
获取原始
\x
属性值。这将确保现有实例继续工作

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

del type(foo).x

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

那么,当您拥有对象时,您可以访问该调用:
您的\u对象。\uuuuuuu class\uuu
@klauds。这并不是说我是否可以访问这个类,而是我是否真的想访问。我希望能在这里找到另一条路。