以下は、Pythonで多態性の動作を学習する際に取り組んでいるコードの例です。 私の質問は、なぜshow_affectionの非常に似た機能を2回宣言しなければならないのですか?呼び出し元(メソッドを呼び出すインスタンス)がDogかどうかをチェックしないでください。コードを保持する多態性メソッドをリファクタリングする方法DRY
以下のサンプルコードに示すように、show_affectionは、Animalを継承するCatクラスとDogクラスの両方で定義されています。
Animal Classでshow_affectionを宣言していないのはなぜですか?私は呼び出し元を確認する方法がわかりません。
ここdef show_affection(self):
If caller is the Dog instance:
print("{0}.barks".format(self.name))
else:
print("{0}.wags tail".format(self.name))
のように私はCat.show_affection()
がDog.show_affection()
は異なる何かをするので、これは、「自分を繰り返す」の一例ではありません
class Animal(object):
def __init__(self, name):
self.name = name
def eat(self, food):
print("{0} eats {1}".format(self.name, food))
class Dog(Animal):
def fetch(self, thing):
print("{0} goes after the {1}".format(self.name, thing))
def show_affection(self):
print("{0} wags tail".format(self.name))
class Cat(Animal):
def swatstring(self):
print("{0} shreds the string".format(self.name))
def show_affection(self):
print("{0} purrs".format(self.name))
for a in (Dog('rover'), Cat('fluffy'), Cat('precious'), Dog('Scout')):
a.show_affection()
a.eat('bananas')
これは、「Animal」クラスがすべての潜在的サブクラスを知る必要があることを意味します。つまり、それは非常に拡張性がありません... DRYのようなこれらの原則の適用には注意が必要です。しかし、あなたの質問に答えるには 'type(self)== Dog'を試すことができます – AChampion
@AChampionありがとう – Stryker