如果您已经一直引用实现类

时间:2018-05-31 10:48:13

标签: python oop

我有一堆python类负责验证文件,如下所示:

  • java file validator
  • html文件验证器
  • css文件验证器
  • javascript文件验证器

所有这些类都定义了validate_file(path)validate_string(string)函数。

在我的应用程序的客户端代码中,我将所有这些验证器存储在一个数组中,然后迭代所有这些验证器并以完全相同的方式调用它们上的方法。

我的目的是定义一个基础"验证器"将这些方法定义为抽象的类?如何使这些单独的类遵循基类?或者换句话说,如果我有一个所有这些验证器实现它的基类,那么将解锁哪些功能?

2 个答案:

答案 0 :(得分:3)

如果您编写的代码需要处理混合类型,其中一些代码可能会定义API方法,但不应该被视为“验证程序”,具有“true”的公共基类“验证器可能有助于提前检查类型并仅处理”真正的“验证器,而不仅仅是”看起来像验证器的东西“。也就是说,方法名称越复杂,就越不可能最终导致这种混乱;通过巧合实现真正利基方法名称的不同类型的几率非常小。

那就是说,这是一个非常小众的用例。通常,正如您所看到的,Python的鸭子打字行为本身就足够好了;如果不同类型之间没有共同的功能,那么拥有抽象基类的唯一有意义的优点是开发人员,而不是程序本身:

  1. API消费者的共同参考点明确了他们可以获得访问权限的方法
  2. 对于具有@abstractmethod修饰方法的实际ABC,它为子类提供定义时间检查,使维护者无法偶然省略方法

答案 1 :(得分:2)

Python中的基类用于共享实现细节和文档相似性。我们不需要使用公共基类来实现类似功能,因为我们使用协议和鸭子类型。对于这些验证功能,我们可能根本没有使用类; Java旨在强迫人们将所有内容都放在类中,但如果你的类中只有一个静态方法,那么这个类只是噪声。拥有一个共同的超类可以让你使用isinstance动态检查它,但是我真的很想知道你为什么要在你不知道它们是什么的环境中处理它们。对于程序员来说,函数名中的常用词可能就足够了。