Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中继承修饰类会引发TypeError:\uuuu init\uuuuu()接受2个位置参数,但给出了4个_Python_Oop_Inheritance_Decorator - Fatal编程技术网

在Python中继承修饰类会引发TypeError:\uuuu init\uuuuu()接受2个位置参数,但给出了4个

在Python中继承修饰类会引发TypeError:\uuuu init\uuuuu()接受2个位置参数,但给出了4个,python,oop,inheritance,decorator,Python,Oop,Inheritance,Decorator,我想使用decorator(定义为类)来装饰其他类。这似乎工作得很好(参见下面的代码)。但是,修饰类被其他几个类继承。问题是,当我继承基类时,我的代码会因为类型错误而崩溃。它说,\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu class Decorator: def __init__(self, cls_): self.__dict__.update(cls

我想使用decorator(定义为类)来装饰其他类。这似乎工作得很好(参见下面的代码)。但是,修饰类被其他几个类继承。问题是,当我继承基类时,我的代码会因为类型错误而崩溃。它说,
\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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:

是的,Decorator的
\uuuuu init\uuuuu
方法被调用时还有两个参数。但我真的不明白为什么,或者我能做些什么来让它工作

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

你对我如何成功地继承装饰过的基类有什么建议吗?当然,我也对保留装饰器和基类的功能感兴趣


谢谢大家!

你确定你需要一个装饰师吗?你的目标是什么?也许您正在寻找一个元类?使用
*args
和/或
**kwargs
?@hiroprotation-我希望有一个上下文管理器来管理Bar类的一些错误。Foo类随后被其他类继承。我最好的想法是使用装饰器来装饰基类(Bar)。我不知道其他方法。使用kwargs并像字典一样检查它的键,以查看哪些值传入(如果传入的话)@JacobIRR我无法使用**kwargs关键字检查参数,因为参数不是通过键值传入的。只有使用*args才能看到参数。
File "test.py", line 13, in <module>
    class Foo(Bar):
TypeError: __init__() takes 2 positional arguments but 4 were given
Got called with: (<class '__main__.Bar'>,)

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