デコレータ関数であるデコレータと異なるクラスと呼ばれるデコレータはありますか?
class MethodDecoratorC(object):
def __init__(self,func):
self.func = func
def __call__(self,*args,**kwargs):
print(len(args))
print(len(kwargs))
self.func(*args,**kwargs)
def method_decorator_f(func):
def wrapped_func(*args,**kwargs):
print(len(args))
print(len(kwargs))
func(*args,**kwargs)
return wrapped_func
彼らは正確に同じことを見て
、そして本当の機能のために次のことを考えてみましょう:
@MethodDecoratorC
def test_method_c(a):
print(a)
@method_decorator_f
def test_method_f(a):
print(a)
test_method_f("Hello World! f")
test_method_c("Hello World! c")
プリント:方法については
1
0
Hello World! f
1
0
Hello World! c
しかし、非常に何か奇妙なことが起こる:
class TestClass(object):
@MethodDecoratorC
def test_method_c(self,a):
print(a)
@method_decorator_f
def test_method_f(self,a):
print(a)
t = TestClass()
t.test_method_f("Hello World! f")
t.test_method_c("Hello World! c")
プリント:
2
0
Hello World! f
1
0
Traceback (most recent call last):
File "test5.py", line 40, in <module>
t.test_method_c("Hello World! c")
File "test5.py", line 8, in __call__
self.func(*args,**kwargs)
TypeError: test_method_c() takes exactly 2 arguments (1 given)
あまり期待されません!何とかTestClassオブジェクトは、私のデコレータオブジェクトの__call__
メソッドへの引数として転送されません。
なぜこの違いがありますか?私のクラススタイルのデコレータでオブジェクトを取得できる方法はありますか?