0

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

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

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

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

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

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

4

1 回答 1

5

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

使用鸭子类型,只要在对象中拥有您想要的方法,您就可以期望该对象是您期望的类型。没有必要检查它的继承。

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

if hasattr(obj, 'common'):
    obj.common()

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

if isinstance(obj, Base):
    obj.common()

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

try:
    obj.common()
except AttributeError:
    print('Oops, object wasn’t right after all')
于 2013-10-07T12:01:41.967 回答