python - 为什么防止实例化理论上抽象的类很重要?

标签 python python-2.7 inheritance abstract-class

我有两个数据结构,Frontier(一个队列)和Explored(一个集合)。我想实现他们共享的自定义 __contains__ 方法:

class Custom_Structure:
    def __contains__(self, item):
        # TODO         

class Frontier(Custom_Structure):
    def __init__(self):
        self.queue = Queue.Queue()

class Explored(Custom_Structure):
    def __init__(self):
        self.set = set()

我了解继承和抽象类的理论(或者至少,我认为我了解!)。在这里将Custom_Structure 设为抽象类似乎是合适的,因为我不打算将其实例化;只有这样 FrontierExplored 才能共享 __contains__ 方法。我不需要任何抽象方法,但这没关系,因为我读过抽象类不一定需要抽象方法。

如果我在 C# 中这样做,我只需添加 abstract 关键字,我就不会问这个问题。但是在 Python (2.7) 中,我似乎需要做这样的事情:

from abc import ABCMeta

class Custom_Structure:
    __metaclass__ = ABCMeta
    ...

好吧,它仍然没什么大不了的,但它的可读性不是很好,而且感觉有点矫枉过正,没有太大好处。我很想按原样保留我的代码。

所以我的问题是:为什么要把 Custom_Structure 抽象化?(如果有人实例化基类怎么办?)

我已经找到了以下问题,但它们并没有完全回答问题:

Why use Abstract Base Classes in Python?这里的答案似乎不适用,因为我没有任何抽象方法,所以基类和子类之间没有契约。

What is the main advantage of making a class abstract一样

Abstract class with no abstract methods答案是“防止实例化”,但为什么会出现这样的问题?

What's the point in having an abstract class with no abstract methods?一样

Why use an abstract class without abstract methods?相同的。我理解为什么不应实例化它的理论概念,但实际上有什么大不了的?

我已经阅读了关于抽象类背后的理论的各种问题和答案 - 我的问题不是关于它们是什么以及它们如何工作(尽管如果我弄错了请告诉我),它更多的是“有什么好处”在这种简单的情况下?

最佳答案

有趣的问题。首先让我说,这个 丑陋之处正是在 python2 中创建抽象类的方式......

from abc import ABCMeta

class Custom_Structure:
    __metaclass__ = ABCMeta

... 已经表明 Python 独裁者认为将类标记为显式抽象并不那么重要。

也就是说,将类抽象化是向代码添加元数据的一种有用方法。这是类的作者与模块的 future 用户交流的一种方式。

在说什么?两件事:

  1. 抽象类不完整,不应该实例化。此类的实例没有具体含义,因为定义是部分。它缺少使对象工作所需的全套信息。

  2. 抽象方法是定义中缺失的部分。通过使方法抽象化,您是在声明要使该类有意义,必须提供完整描述的this 特定部分。不仅如此,通过提供一个接口(interface),您还传达了缺失部分的预期行为,无论内部细节最终是什么。

当然,所有这些在实践中都可能是这种情况,而无需对类或其方法进行任何额外的规范,但是继承者最终会猜测如何使用该对象,或者必须阅读详细的文档。

如果您隐式实例化一个抽象类,迟早会发生错误。当缺少某些内容时,最终可能会产生 NotImplementedErrorKeyError。这个错误很容易犯,并且在尝试使用对象的功能时会出现。

如果您尝试显式 实例化抽象类,则会立即出现错误。 不掷骰子,并且无论何时以某种方式使用该类,问题都不会推迟。缺少抽象方法的实现不会在使用该方法时以及是否使用该方法时导致错误,但会在出现编码错误时立即导致错误。

总而言之,使一个类及其某些方法显式抽象可以使代码的真实性与文档保持一致。它将了解规则的责任从没有经验的用户转移到作者身上。 这是一种让语言运行时在实践中强制执行理论规则和使用约束的方法

关于python - 为什么防止实例化理论上抽象的类很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956825/

相关文章:

python - 无法使用 python 2.7 在 Mysql 中插入类型文本

python - 在 Python 中打印没有换行符(但有空格)的列表

java - 核心 Java 库中继承的最佳示例是什么?

c# - 在派生类中强制声明属性

javascript - 适用于 mpld3 的 NetworkX D3 强制布局插件

Python HDF5/NumPy 以不同方式打印数组

python - 有没有办法在 Blender 中使用 python 脚本复制/粘贴 Action 关键帧?

python - Imposm 已安装,但缺少模块

C# - 从派生类中隐藏 UserControl 类的所有方法

Python 2.7.5 打印 float 列表时出错