【问题标题】:Define properties for object instances定义对象实例的属性
【发布时间】:2016-06-05 03:59:27
【问题描述】:

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

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

是否有可能将foo.x 替换为@property-like 这样的赋值

foo.x = "bar"

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

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

【问题讨论】:

  • 好吧,当您拥有对象时,您可以访问调用:your_object.__class__
  • @KlausD。这不是关于我是否可以访问课程,而是我是否真的想要。我希望在这里找到一些替代方法。

标签: python properties


【解决方案1】:

您不能将属性放在实例上,不。您必须对类进行猴子补丁或子类化。

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 对象。现在该类的 all 实例将具有该属性!为了解决这个问题,如果不存在 _x 属性,上面的 getter 会回退到尝试从实例 __dict__ 获取原始 x 属性值。这应确保现有实例继续工作。

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

del type(foo).x

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

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多