【发布时间】:2021-12-12 14:43:51
【问题描述】:
我需要重写之前已经重写了 SuperClass 的 SubClass1。它看起来像这样:
class SuperClass:
def function(self, args: List[str] = None):
# some code
class SubClass1(SuperClass):
@overrides(SuperClass)
def function(self, args: List[str] = None):
# some code
super().function(args)
class SubClass2(SubClass2):
@classmethod
@overrides(SubClass2)
def function(self, args: List[str] = None):
# some code
super().function(args)
SuperClass1 和 SuperClass2 中的函数只有一个区别。这是没有一个命令。我没有更改任何参数。
我不确定是否可以通过这种方式覆盖函数。但是,我只在最后一步遇到问题,我在 SubClass2 中调用 super()
> super().function(args)
E TypeError: super(type, obj): obj must be an instance or subtype of type
可能,我最初犯了一个愚蠢的错误,因为在我的情况下,我必须在 SubClass2 中使用 @classmethod,而我的 IDE 告诉我在此函数中使用 cls 而不是 self。
overrides函数:
def overrides(interface_class):
"""Marks method as override of parent class' method"""
def overrider(method):
assert (method.__name__ in dir(interface_class))
return method
return overrider
【问题讨论】:
-
overrides装饰器从何而来?此外,您的缩进似乎错误 - 请提供minimal reproducible example。解释一下为什么要尝试用 class 方法覆盖 instance 方法会很有帮助。 -
也许
overrides是pytests的一部分,所以我不使用导入。我对overrides装饰器的理解是否正确?我不确定我的缩进是否完全错误,因为它有效。minimal reproducible example怎么样?我不确定我是否可以在这里提供更多信息的示例,因为这段代码有很多依赖关系并且它的逻辑非常棘手。不过,我希望我已经展示了主要方案是如何工作的。 -
我怀疑是我的错误:
you're trying to override an instance method with a class method.如你所说。 -
嗯,它肯定不是像
classmethod那样的built-in function,而且我在the pytest API 中也看不到它。如果你不能给人们一些让他们重现问题的东西,他们可能无法帮助你解决它。 -
我找到了
overrides函数,是的,我导入了这个)