python 类装饰器和继承_python – 装饰器中的无限递归(类似乎从它自身继承)

我在装饰类中看到无限递归:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值