__init__
デコレータを使用する以外は、さまざまなオブジェクトのすべてのメソッドをラップしたいと思います。
class MyObject(object):
def method(self):
print "method called on %s" % str(self)
@property
def result(self):
return "Some derived property"
def my_decorator(func):
def _wrapped(*args, **kwargs):
print "Calling decorated function %s" % func
return func(*args, **kwargs)
return _wrapped
class WrappedObject(object):
def __init__(self, cls):
for attr, item in cls.__dict__.items():
if attr != '__init__' and (callable(item) or isinstance(item, property)):
setattr(cls, attr, my_decorator(item))
self._cls = cls
def __call__(self, *args, **kwargs):
return self._cls(*args, **kwargs)
inst = WrappedObject(MyObject)()
ただし、プロパティインスタンスの結果のラッピングは、次のようになります。
@my_decorator
@property
def result(self):
return "Some derived property"
目的の結果がこれと同等の場合:
@property
@my_decorator
def result(self):
return "Some derived property"
プロパティオブジェクトの属性は読み取り専用であり、プロパティが関数をラップした後に関数を変更できないようです。私はすでに必要なハッカーのレベルにあまり慣れていないので、とにかくプロパティオブジェクトを掘り下げたくありません。
私が見ることができる他の唯一の解決策は、私が避けたいと思っていたメタクラスをその場で生成することです。明らかな何かが欠けていますか?