次のクラスがあるとします。
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() は有害と見なされる」に基づく記事を見たことがあります。ただし、少なくともプログラマーとして、オブジェクトがどこから関数を取得するかではなく、インターフェイスを実装しているかどうかを知りたいと思っています。
このアプローチは有用ですか? もしそうなら、それを改善できますか?