假设我们有以下类:
class Duck(object):
pass
class OldFashionedDuck(Organism, Duck):
def look(self):
self.display_biological_appearance()
def walk(self):
self.keep_balance_on_two_feet()
def quack(self):
self.make_noise_with_lungs("Quack!")
class ArtificialDuck(Robot, Duck):
def look(self):
self.display_imitation_biological_appearance()
def walk(self):
self.engage_leg_clockwork()
def quack(self):
self.play_sound("quack.au")
在这个例子中,OldFashionedDuck 和ArtificialDuck 没有共同的实现,但是通过构造它们都将为isinstance(..., Duck) 返回True。
这并不完美,但我认为这可能有助于尊重鸭子类型,并且(通过空的 mixin 继承)允许 isinstance()。本质上,它提供了一个满足接口的契约,因此它并不是真正基于完成所有工作的类调用 isinstance(),而是基于任何人都可以选择加入的接口。
我看过基于“isinstance() 被认为有害”的文章,因为它破坏了鸭子类型。但是,我至少作为一名程序员想知道,如果不一定是对象从哪里获取函数,而是它是否实现了接口。
这种方法有用吗?如果有用,可以改进吗?