【问题标题】:Abstract classes with varying amounts of parameters具有不同数量参数的抽象类
【发布时间】:2017-08-04 08:43:26
【问题描述】:

我想知道在创建具有抽象方法的抽象类时是否可以允许派生类中的这些方法的实现为每个函数具有不同数量的参数。

我目前有我的抽象类

from abc import ABCMeta, abstractmethod

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

    @abstractmethod
    def get(self):
        pass

但我希望能够在一个类中实现它,设置有 1 个参数并获得 2 (set(param1)get(param1, param2)), 然后在另一个类中也继承它,但 set 有 0 个参数,get 有 2 个参数 (set()get(param1, param2))。

这可能吗?如果可以,我将如何去做

【问题讨论】:

  • 虽然您可以做到这一点,但这样做真的很奇怪。抽象方法的语义几乎总是包含它应该采用的参数。您可能需要重新考虑这个抽象方法或抽象类是否真的有意义。

标签: python python-3.x abc


【解决方案1】:

没有检查具体实现需要多少参数。所以没有什么能阻止你这样做了。

只需定义这些方法以获取您需要接受的任何参数:

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

【讨论】:

  • 哦,它一定只是 pycharm 中的 pep8 告诉我然后谢谢你
  • 难道没有什么方法不会导致警告吗?
  • @matheburg 什么警告? Python 本身不会为此发出警告。您是否正在使用 linter(可能作为 IDE 功能)?
  • @MartijnPieters Signature of method '...' does not match signature of base method in class '...' 至少由 PyCharm 显示。看起来这是一些 PyCharm 内部警告,而不是 PEP8,参见例如this example。因此,让我们重新提出我的问题:如果有人对此提出警告,那么这种情况下的最佳实践设计模式是什么?
  • @matheburg:不要更改您的方法签名,至少不要更改所需的组件。使用可选参数来扩展(所以关键字参数)。
【解决方案2】:

python 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2018-04-08
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多