在Python中创建类似Java的接口

MeL*_*ght 0 python inheritance interface

我有多个具有共同功能的类,由于各种原因,它们的实现方式不同.我在相同的上下文中使用所有这些类,但我不知道在运行时将使用哪一个.我想实例化不同的类,但使用相同的代码行来调用常用功能.

所以,我虽然使用继承(显然),现在我的代码看起来像这样:

class Base():
  def common(self):
    return "abstract"

class A(Base):
  def common(self):
    return "A"

class B(Base):
  def common(self):
    return "B"
Run Code Online (Sandbox Code Playgroud)

我希望能够将任何派生类实例化为Base(这样我就不必特殊情况并检查我添加的每个新类)并调用它的common方法并获得所需的"A"或"B" "结果.

pok*_*oke 6

Python是一种带有鸭子类型的动态类型语言.与Java等静态类型语言不同,不需要接口.如果你有一个对象,你可以调用任何你想要的任何方式的方法就可以了.解释器将尝试找到这样的方法并调用它,可能发生的最坏情况是在运行时获得异常.这就是动态类型语言的工作方式.

使用duck typing,只需在对象中拥有所需的方法,就可以期望该对象具有您期望的类型.没有必要检查它的继承.

所以在你的情况下,你甚至可以摆脱Base(除非你当然想要提供一个默认的实现).然后你就可以得到一个对象obj.common().如果您想要非常安全,您还可以先检查方法是否存在:

if hasattr(obj, 'common'):
    obj.common()
Run Code Online (Sandbox Code Playgroud)

或者,如果您保留基本类型,您还可以根据需要检查继承:

if isinstance(obj, Base):
    obj.common()
Run Code Online (Sandbox Code Playgroud)

但一般来说,你只需要调用方法并检查它是否有效:请求宽恕比允许更容易.所以你会这样做:

try:
    obj.common()
except AttributeError:
    print('Oops, object wasn’t right after all')
Run Code Online (Sandbox Code Playgroud)