我有一个python类的实例。

class Fum(object):
  foo = Foo()
  bar = Bar()

fum = Fum()

由于我不想进入的充分理由,我想用猴子修补该对象,以便在某些用例中其属性之一是禁止进入的。我希望如果我或其他开发人员尝试在猴子修补的对象上使用该属性,则会引发一个有用的异常来解释这种情况。我试图用一个属性来实现它,但是没有运气。

例如。,
def raiser():
  raise AttributeError("Don't use this attribute on this object. Its disabled for X reason.")

fum.bar = property(raiser)

>>> fum.bar
>>> <property object at 0xb0b8b33f>

我想念什么?

最佳答案

您不能将属性直接猴子修补到对象的实例上。 descriptors是类级别的概念,必须在实例的类层次结构中。有一个有效的技巧,但是:

class Fum(object):
    foo = Foo()
    bar = Bar()

fum = Fum()

class DerivedFum(fum.__class__):
    bar = property(raiser)

fum.__class__ = DerivedFum

fum.bar # --> raise AttributeError

10-05 19:15