定義元類,然後就在類定義年底申請裝飾。
class Classname:
def foo(self): pass
for name, fn in inspect.getmembers(Classname):
if isinstance(fn, types.UnboundMethodType):
setattr(Classname, name, decorator(fn))
對於Python 3只需更換types.UnboundMethodType
與types.FunctionType.
但如果你真的不;噸想用檢查比你可以做這樣的
import types
class DecoMeta(type):
def __new__(cls, name, bases, attrs):
for attr_name, attr_value in attrs.iteritems():
if isinstance(attr_value, types.FunctionType):
attrs[attr_name] = cls.deco(attr_value)
return super(DecoMeta, cls).__new__(cls, name, bases, attrs)
@classmethod
def deco(cls, func):
def wrapper(*args, **kwargs):
print "before",func.func_name
func(*args, **kwargs)
print "after",func.func_name
return wrapper
class MyKlass(object):
__metaclass__ = DecoMeta
def func1(self):
pass
MyKlass().func1()
輸出:
FUNC1
之前之後FUNC1
注意:它不會裝飾靜態方法和類方法
。在你的示例中沒有的元類。 – delnan 2012-08-09 21:27:56
你確定它不會裝飾靜態方法嗎?因爲在提出這個問題之後,我發現了新方法,並且在靜態方法工作的地方寫了一些非常類似的東西。 – weeb 2012-08-09 21:43:28