微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中继承装饰的类会引发TypeError:__init __接受2个位置参数,但给出了4个

如何解决在Python中继承装饰的类会引发TypeError:__init __接受2个位置参数,但给出了4个

我想使用装饰器(定义为类)来装饰其他类。这似乎很好用(请参见下面的代码)。但是,修饰的类是由其他一些类继承的。问题是,当我继承基类时,由于TypeError导致代码崩溃。它说__init__ takes 2 positional arguments,but 4 were given

class Decorator:
    def __init__(self,cls_):
        self.__dict__.update(cls_.__dict__)
        self.__class = cls_

    def __call__(self,*args):
        return self.__class(*args)

@Decorator
class Bar():
    pass

class Foo(Bar):
    pass

代码会产生TypeError:

File "test.py",line 13,in <module>
    class Foo(Bar):
TypeError: __init__() takes 2 positional arguments but 4 were given

我打印了Decorator的__init__方法中使用的参数,然后得到了:

Got called with: (<class '__main__.Bar'>,)

Got called with: ('Foo',(<__main__.Decorator object at 0x00000175E80C5490>,),{'__module__': '__main__','__qualname__': 'Foo'})

是的,用另外2个参数调用装饰器的__init__方法。但是我真的不明白为什么,或者为了使它起作用我该怎么做。

长话短说:我可以装饰一个类(Bar),但是从该类继承(例如Foo)会引发TypeError,因为它被另外两个参数调用。我不知道这两个参数代表什么或如何使它起作用。

您对我如何成功继承装饰后的基类有任何建议吗?我当然也有兴趣保留装饰器和基类的功能

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。