我在装饰类中看到无限递归:
def my_decorator():
def class_decorator(cls):
class NewClass(cls):
@classmethod
def func(cls):
print "decorator"
super(NewClass, cls).func()
return NewClass
return class_decorator
class B(object):
@classmethod
def func(cls):
print "Root"
@my_decorator()
class A(B):
@classmethod
def func(cls):
print "func"
super(A, cls).func()
x = A()
x.func()
输出:
decorator
func
func
func
func
... ...
lots of these:
File "test.py", line 22, in func
super(A, cls).func()
File "test.py", line 22, in func
super(A, cls).func()
File "test.py", line 22, in func
super(A, cls).func()
RuntimeError: maximum recursion depth exceeded while calling a Python object
没有装饰器,它返回:
func
Root
……正如所料.
这是怎么回事?
最佳答案 在您装饰原始A之后,相当于:
A = my_decorator()(A)
名称A指的是新创建的NewClass,它也继承自原始A,而不是原始A.因此,super(A,cls).func总是解析为super(NewClass,cls).func,即A.func.
展开装饰器并将结果分配给其他名称,您将获得正确的行为:
X = my_decorator()(A)
x = X()
x.func()
得到:
decorator
func
Root