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" "结果.
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)
归档时间: |
|
查看次数: |
1418 次 |
最近记录: |