具有不同参数量的抽象类

1se*_*anr 9 python abc python-3.x

我想知道在使用抽象方法创建抽象类时是否可能,如果它可以允许派生类中的那些方法的实现为每个函数提供不同数量的参数.

我目前有抽象课

from abc import ABCMeta, abstractmethod

class View(metaclass=ABCMeta):
    @abstractmethod
    def set(self):
        pass

    @abstractmethod
    def get(self):
        pass
Run Code Online (Sandbox Code Playgroud)

但是我希望能够在一个类中实现它,set有1个参数并且得到2(set(param1)get(param1, param2)),然后在另一个类中也继承它但是有0个参数set,2个用于get (set()get(param1, param2)).

这是可能的,如果是这样,我将如何去做

Mar*_*ers 18

没有检查具体实现有多少参数.所以没有什么可以阻止你做这件事.

只需定义这些方法即可接受您需要接受的任何参数:

class View(metaclass=ABCMeta):
    @abstractmethod
    def set(self):
        pass

    @abstractmethod
    def get(self):
        pass


class ConcreteView1(View):
    def set(self, param1):
        # implemenation

    def get(self, param1, param2):
        # implemenation


class ConcreteView2(View):
    def set(self):
        # implemenation

    def get(self, param1, param2):
        # implemenation
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它一定是pycharm中的pep8告诉我,然后谢谢 (5认同)
  • 有没有什么方法可以不发出警告呢? (3认同)
  • @MartijnPieters `方法'...'的签名与类'...'中的基方法的签名不匹配`至少由PyCharm显示。看起来这是一些 PyCharm 内部警告,而不是 PEP8,请参见例如[此示例](/sf/ask/3188859551/ - 课堂方法)。因此,让我们重新表述我的问题:如果有人对此提出警告,那么针对这种情况的最佳实践设计模式是什么? (3认同)
  • @matheburg:不要更改您的方法签名,至少不要更改所需的组件。使用可选参数来扩展(因此关键字参数)。 (2认同)
  • @daniel451:答案解决了Python“abc”模块的技术细节以及OP在问题中使用的特定调用签名。我尝试在自己的工作中坚持里氏替换原则,因此在这种情况下我不会使用位置参数。 (2认同)

n0n*_*ker 9

蟒蛇3.8

from abc import ABC, abstractmethod


class SomeAbstractClass(ABC):
    @abstractmethod
    def get(self, *args, **kwargs):
        """
        Returns smth
        """

    @abstractmethod
    def set(self, key, value):
        """
        Sets smth
        """

class Implementation(SomeAbstractClass):
    def set(self, key, value):
        pass

    def get(self, some_var, another_one):
        pass
Run Code Online (Sandbox Code Playgroud)

完美运行,没有警告,没有问题

  • 如果“Implementation”类有一些子类并且该类调用“get”方法怎么办?我收到的错误类似于“W0221:参数数量在“BaseSetter.create”中为 2,现在在重写的“DocumentsTotalsSetter.create”方法中为 4(参数不同)” (3认同)