比方说,我们有以下类别:这种将鸭子打字与isinstance()混合在一起的方法是否合理?
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(...,鸭)返回True。
这并不完美,但它是我认为可能有助于尊重鸭子打字和(通过空的mixin继承)allow isinstance()的东西。实质上,它提供了一个契约来满足一个接口,所以它不是基于完成所有工作的类来调用isinstance(),而是基于任何人都可以选择的接口。
我看过基于“isinstance()被认为有害的文章”,因为它打破了鸭子的打字。然而,至少我作为一个程序员想知道,如果不一定是一个对象从哪里获取函数,但是它是否实现了一个接口。
这种方法是否有用,如果有的话可以改进?
您不清楚如何或为什么要使用'isinstance()'。这使得很难解决这是否是正确的事情。 –
[抽象基类](http://www.python.org/dev/peps/pep-3119/)会为此工作吗? –