比方說,我們有以下類別:這種將鴨子打字與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/)會爲此工作嗎? –