【问题标题】:Is there a purpose for creating an Abstract class similar to the following是否有创建类似于以下的抽象类的目的
【发布时间】:2019-04-18 19:34:55
【问题描述】:

我经常看到这样实现的类,只是想知道为什么?即使它是基类,也不会创建子类可以遵循的接口。

class AnAbstractBaseCLass:
    pass

【问题讨论】:

  • 你确定没有类在你正在查看的代码中使用它作为父级吗?
  • 也许有人希望稍后在基类中添加一些东西。
  • @Error-SyntacticalRemorse 就像一般来说,这可能是一个没有继承的有效基类/类吗?如果不是,那为什么会这样?
  • 我必须同意@khelwood 的观点,这可能只是开发人员期望基类在未来可能会有优势的问题。

标签: python class oop inheritance


【解决方案1】:

如果子类的实例可能与其他非派生类的实例混合在一起并且您想轻松地将它们区分开来,那么拥有一个类似于您所展示的基类会很有用。

class Base: pass  # empty base class

class Derived1(Base): pass # normally this would have contents, but it's empty for this example
class Derived2(Base): pass

class OtherClass: pass # not derived from Base

mixed_list = [Derived1(), Derived2(), OtherClass()]

filtered_list = [obj for obj in mixed_list if isinstance(obj, Base)]

这可能不是那么有价值,因为派生类不能保证有任何共同的接口,所以filtered_list 可能无法很好地利用(因为你不能调用任何通用方法关于它的价值观)。但是有可能,甚至有可能一些通用接口,它不是由基类(使用abc 模块)强制执行的任何东西。

【讨论】:

    【解决方案2】:

    也许这类似于 Java 的标记接口。例如。 RandomAccess 是一个 void 接口(没有方法):

    List 实现使用的标记接口表明它们支持快速(通常是恒定时间)随机访问。此接口的主要目的是允许通用算法改变其行为,以便在应用于随机或顺序访问列表时提供良好的性能。

    列表是否支持快速随机访问并不影响列表的界面,而是影响列表的性能。

    更一般地说,接口或基类,作为一组公共方法(无论“公共”在 Python 中的真正含义是什么),是一种功能契约,但不涉及非功能性问题(参见 @987654322 @)。大多数时候,我们确切地知道我们使用的对象的类型,但有时,由于多态性,我们不知道。然而,我们可能需要一些非功能性信息,而 void 基类可能是一个很好的解决方案:

    if isinstance(L, RandomAccess):
        # I can use L[i] without performance penalty 
    else:
        # I will use an iterator
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2011-09-24
      • 2011-05-31
      • 2016-09-25
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多