2016-09-23 8 views
0

以下は、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') 
+0

これは、「Animal」クラスがすべての潜在的サブクラスを知る必要があることを意味します。つまり、それは非常に拡張性がありません... DRYのようなこれらの原則の適用には注意が必要です。しかし、あなたの質問に答えるには 'type(self)== Dog'を試すことができます – AChampion

+0

@AChampionありがとう – Stryker

答えて

1

を持っているものです。 2つのメソッドが同じ場合は、実装をAnimalに一度定義して繰り返しを避けることができます。しかし、CatDogの動作が異なるため、正しい方法は各クラスにメソッドを実装することです。

一般的には:

  • 猫特有の行動はCatで定義する必要があります。
  • 犬固有の行動は、Dogで定義する必要があります。
  • すべての動物に適用される行動は、Animalで定義する必要があります。
関連する問題