これは醜いですが、私はそれがあなたが望むことをすると思いますが、継承はありません:
class DoAfter(object):
def __init__(self, obj, func):
self.obj = obj
self.func = func
def __getattribute__(self, attr, *a, **kw):
obj = object.__getattribute__(self, 'obj')
if attr in dir(obj):
x = getattr(obj, attr)
if callable(x):
def b(*a, **kw):
retval = x(*a, **kw)
self.func()
return retval
return b
else:
return x
else:
return object.__getattribute__(self, attr)
次のように使用します。
>>> class A(object):
... def __init__(self):
... self.a = 1
...
... def boo(self, c):
... self.a += c
... return self.a
>>> def do_something():
... print 'a'
>>> a = A()
>>> print a.boo(1)
2
>>> print a.boo(2)
4
>>> b = DoAfter(a, do_something)
>>> print b.boo(1)
a
5
>>> print b.boo(2)
a
7
A
A.boo
が呼び出されるたびにカウンターをインクリメントします。DoAfter は A をラップするため、インスタンス内の任意のメソッドをa
のメンバーであるかのように呼び出すことができますb
。すべてのメソッドがこのようにラップされているためdo_something()
、メソッドがアクセスされるたびに呼び出されることに注意してください。
これはほとんどテストされておらず、推奨されておらず、おそらく悪い考えです。しかし、私はそれがあなたが求めたものをしていると思います。
編集:継承でこれを行うには:
class graph(algorithms):
def refreshgraph(self):
print 'refreshgraph'
def __getattribute__(self, attr):
if attr in dir(algorithms):
x = algorithms.__getattribute__(self, attr)
if callable(x):
def wrapped(*a, **kw):
retval = x(*a, **kw)
self.refreshgraph()
return retval
return wrapped
else:
return x
else:
return object.__getattribute__(self, attr)