クラス内のメソッドにPythonデコレータを適用することからの答えを少し変更すると、クラス内のすべてのメソッドにデコレータを適用することが可能になります。検査モジュールなしでこれを行う方法はありますか?私はメタクラスを使用してこれを達成しようとし、__ getattribute__を変更してきましたが、無限の再帰が発生し続けます。From __getattribute__メソッドはどのように使用されますか?、これは、object .__ getattribute __(self、name)を使用して通常のクラスで修正できます。メタクラスに相当するものはありますか?
質問する
1410 次
1 に答える
3
メタ クラスを定義し、クラス定義の最後にデコレータを適用するだけです。
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 の
後
注: staticmethod と classmethod は装飾しません
于 2012-08-09T21:26:12.950 に答える