继承自装饰类

Pau*_*nta 3 python inheritance decorator

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

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

@Decorator
class Foo:
    pass

class Goo(Foo):
    pass
Run Code Online (Sandbox Code Playgroud)

我尝试子类化时得到的错误Foo是这样的:

回溯(最近一次调用最后一次):
   文件"test.py",第9行,在
      类Goo(Foo)中:
TypeError:__ init __()需要2个位置参数(给定4个)

通过添加另一个init函数来Decorator...

def __init__(self, *args):
    for arg in args:
        print(arg)
Run Code Online (Sandbox Code Playgroud)

...我得到以下输出:

<class'__main __.Foo'>
Goo
(<__ main __.装饰器对象位于0x010073B0>,)
{'__ mododu ___:' _ _ main__'}

那些参数是什么,我应该如何在里面使用它们Decorator

yak*_*yak 8

我会尝试回答"那些参数是什么"的问题.这段代码:

@Decorator
class Foo:
    pass
Run Code Online (Sandbox Code Playgroud)

相当于:

class Foo:
    pass
Foo = Decorator(Foo)
Run Code Online (Sandbox Code Playgroud)

这意味着,Foo最终被一个实例的的Decorator类,而不是作为一个类.

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

这就是你最终得到这些论点的方式Decorator.__init__.

有关这方面的更多信息,请访问:http: //www.python.org/download/releases/2.2.3/descrintro/#metaclasses (特别是"当执行类语句时..."部分)