0

クラス内のメソッドにPythonデコレータを適用することからの答えを少し変更すると、クラス内のすべてのメソッドにデコレータを適用することが可能になります。検査モジュールなしでこれを行う方法はありますか?私はメタクラスを使用してこれを達成しようとし、__ getattribute__を変更してきましたが、無限の再帰が発生し続けます。From __getattribute__メソッドはどのように使用されますか?、これは、object .__ getattribute __(self、name)を使用して通常のクラスで修正できます。メタクラスに相当するものはありますか?

4

1 に答える 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.UnboundMethodTypetypes.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 に答える