2012-11-08 5 views
5

私はPythonクラスのインスタンスを持っています。その属性の一つは、立ち入り禁止、特定のユースケースであるように私は、このオブジェクトモンキーパッチにしたい、に入るためにしたくない正当な理由のためにオブジェクトの特定の属性の使用を試みるとAttributeErrorを発生させるMonkeyパッチ

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 
関連する問題