Python3 abstract方法,参数与被重写的方法不同

Python3 abstractmethod, parameters differ from overridden method

提问人:pyjedy 提问时间:5/23/2021 最后编辑:pyjedy 更新时间:5/23/2021 访问量:2022

问:

类 Parent 有一个抽象方法,我需要在子类/方法的方法中使用不同数量和类型的参数。

from abc import ABC, abstractmethod


class Parent(ABC):
    """Parent"""
    @abstractmethod
    def method(self, *args):
        """method"""


class Child1(Parent):
    """Child1"""
    def method(self, arg1: int):
        print(arg1)


class Child2(Parent):
    """Child2"""
    def method(self, arg1: str, arg2: dict):
        print(arg1, arg2)

对于此代码,pylint 向我显示下一个警告:

[W0221(参数-不同),Child1.方法]参数不同于 重写的“method”方法

是否有可能解决 pylint 警告并继续在子类中使用不同的参数? 我不想在儿童方法中使用。*args

Python 方法 pylint abc

评论

6赞 flakes 5/23/2021
如果这些方法采用不同的参数,你就违反了里氏替代原则。Pylint 正确地将您的方法标记为不良样式。
0赞 Samwise 5/23/2021
尝试使用您定义的接口的调用方会发现它实际上在任一实现中都不起作用。这不仅仅是坏代码,而是恶意代码。Linter 的存在是专门为帮助人们不写这样的代码而存在的——如果你想写故意邪恶的代码,你就不想使用 Linter。ParentChild
0赞 pyjedy 5/23/2021
感谢您的澄清,此模式不正确且与 pylint 不兼容。
0赞 Justin P. 2/2/2022
@Samwise 那还有什么选择呢?如果你有具有不同类型输入的子类,你是否应该永远不要使用抽象方法?这样的父类似乎是定义类共性的好地方。
1赞 Samwise 2/2/2022
抽象父类的要点是定义一个通用接口,您可以在不了解具体实现的情况下使用它。这与此完全相反 - 没有通用接口,您绝对必须知道您拥有哪种实现才能正确使用该类。除了试图混淆试图弄清楚代码的人之外,没有理由存在于这种情况中。Parent

答: 暂无答案