1

次のコードがあります

def timer_dec(f):
    def wrapper(*args, **kwargs):
        t = time.time()
        args[0].debug('<{}> start'.format(f.__name__))
        res = f(*args, **kwargs)
        args[0].debug('<{}> finish'.format(f.__name__))
        args[0].debug("Working time for function <%s>: %f" % (f.__name__, time.time() - t))
        return  res

    return wrapper

これは正常に機能します。

@timer_dec
class A(object):
  pass

しかし、これは機能していません。

@timer_dec
class A(object):
  pass

class B(A):
  pass

TypeError:メタクラスベースの関数()を呼び出すときのエラー引数1は、strではなくコードである必要があります

Pythonのバージョンは2.7です

4

2 に答える 2

4

関数デコレータをクラスデコレータとして使用しているようです。

@timer_dec
class A(object):
  pass

と同等です

class A(object):
  pass
A = timer_dec(A)

timer_dec関数を返すため、Aは関数になりました。


クラスのすべてのメソッドに関数デコレータを適用するクラスデコレータを作成できます。例については、こちらをご覧ください:クラスのメソッドにPythonデコレータを適用することに対するAlexMartelliの回答

于 2013-03-01T10:32:40.307 に答える
0

デコレータが関数を返しています。したがって、デコレータ呼び出しの後、名前「A」はクラスではなく関数にバインドされます。次に、関数AからBを継承しようとしますが、これは不正です。

于 2013-03-01T10:31:37.760 に答える