类装饰器,继承,super()和最大递归

发布于 2021-01-29 16:04:23

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

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 <module>
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
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    装饰者创建一种钻石继承情况。您可以通过不使用来避免这些问题super()。更改SubClassAgain为以下内容将防止无限递归:

    @class_decorator
    class SubClassAgain(BaseClass):
        def print_class(self):
            BaseClass.print_class(self)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看