python 类装饰器和继承_python – 类装饰器,继承,超级()和最大递归

本文探讨了在Python中使用类装饰器时遇到的问题,特别是当装饰器创建新的子类并影响`super()`函数的行为时。通过一个示例展示了类装饰器如何导致递归深度错误,当尝试在装饰后的子类上调用`super()`时。作者寻求解决方案,希望能实现装饰类而不破坏其继承链和`super()`的正常工作。
摘要由CSDN通过智能技术生成

我试图弄清楚如何在使用super()的子类上使用装饰器.由于我的类装饰器创建另一个子类,因此装饰类似乎在更改传递给super(className,self)的className时阻止使用super().以下是一个例子:

def class_decorator(cls):

class _DecoratedClass(cls):

def __init__(self):

return super(_DecoratedClass, self).__init__()

return _DecoratedClass

class BaseClass(object):

def __init__(self):

print "class: %s" % self.__class__.__name__

def print_class(self):

print "class: %s" % self.__class__.__name__

bc = BaseClass().print_class()

class SubClass(BaseClass):

def print_class(self):

super(SubClass, self).print_class()

sc = SubClass().print_class()

@class_decorator

class SubClassAgain(BaseClass):

def print_class(self):

super(SubClassAgain, self).print_class()

sca = SubClassAgain()

# sca.print_class() # Uncomment for maximum recursion

输出应该是:

class: BaseClass

class: BaseClass

class: SubClass

class: SubClass

class: _DecoratedClass

Traceback (most recent call last):

File "class_decorator_super.py", line 34, in

sca.print_class()

File "class_decorator_super.py", line 31, in print_class

super(SubClassAgain, self).print_class()

...

...

RuntimeError: maximum recursion depth exceeded while calling a Python object

有没有人知道在使用装饰器时不破坏使用super()的子类的方法?理想情况下,我希望不时地重复使用一个类,并简单地修饰它而不会破坏它.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值