2012-11-08 3 views
5

파이썬 클래스의 인스턴스가 있습니다. 내가 들어갈하지 않으려는 이유를 들어오브젝트의 특정 속성을 사용하려고 시도했을 때 AttributeError를 발생시키는 원숭이 패치

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> 

나는 무엇을 놓치고?

답변

4

개체의 인스턴스에 직접 속성을 monkeypatch 할 수 없습니다. descriptors은 클래스 수준의 개념이므로 인스턴스의 클래스 계층 구조에 있어야합니다. 하지만 작동하는 트릭이 있습니다.

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

fum = Fum() 

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

fum.__class__ = DerivedFum 

fum.bar # --> raise AttributeError 
관련 문제