我正在尝试用另一个类装饰一个类。我也想从装饰类继承,但我得到了一些错误。这是我的代码:

class Decorator:
    def __init__(self, decorated):
        pass

@Decorator
class Foo:
    pass

class Goo(Foo):
    pass

当我尝试从 Foo 子类化时遇到的错误是:



通过向 Decorator 添加另一个 init 函数...
def __init__(self, *args):
    for arg in args:
        print(arg)

...我得到以下输出:



这些参数是什么,我应该如何在 Decorator 中使用它们?

最佳答案

我将尝试回答“这些参数是什么”的问题。这段代码:

@Decorator
class Foo:
    pass

相当于:
class Foo:
    pass
Foo = Decorator(Foo)

这意味着 Foo 最终成为 Decorator 类的 实例 而不是一个类。

当您尝试将此实例用作类 ( Goo ) 的基础时,Python 必须确定将用于创建新类的元类。在这种情况下,它将使用等于 Foo.__class__Decorator 。然后它将使用 (name, bases, dict) 参数调用元类并期望它返回一个新类。

这就是你在 Decorator.__init__ 中得到这些参数的方式。

可以在此处找到有关此内容的更多信息:
http://www.python.org/download/releases/2.2.3/descrintro/#metaclasses
(特别是“当执行类语句时...”部分)

关于python - 从装饰类继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7477311/

10-11 20:53