基类是否应包含虚拟或占位符定义以及原因?

时间:2015-12-15 09:53:22

标签: python

让我解释一下我的意思"假/占位符定义"用以下简单的例子。不知道如何正确地打电话给他们。

class GateBase:
    def __init__(self):
        self.inputs = None
        self.output = None

    def eval(self):
        raise NotImplementedError

class AndGate(GateBase):
    def __init__(self, *inputs):
        super().__init__()
        self.inputs = inputs

    def eval(self):
        self.output = all(inp for inp in self.inputs)

class OrGate(GateBase):
   ...

class XorGate(GateBase):
   ...

刚引发异常的基类中的eval函数没有实际功能。没有基类中的虚拟eval,如果派生类"忘记"要实现自己的eval,无论如何都会抛出异常,只是一种不同的类型。没有必要提醒。

self.inputs是一个类似的案例。每个派生类只需定义其输入即可使用。

那么在基类中定义self.inputsself.eval()的主要目的是什么? API的文档? pylint的? Pythonic风格?或者它是从ABC(抽象基类)中获取的想法?

1 个答案:

答案 0 :(得分:2)

使用" dummies"作为你的名字的主要目的是多态性的原则:

Wikipedia - Polymorphism (computer_science)

这个原则适用于所有面向对象的语言。该原则的主要思想是为每个派生类在基类中修复相同的接口。这就是为什么你应该在基类中使用抽象方法来确保它们在派生类中的存在和实现。