0

Python 2.7(google app engine)を使用しています

学習Pythonして、私は言語がどのように継承を使用してポリモーフィズムを達成するかを理解しました。

INHERITANCE-ベースのポリモーフィズムPYTHON

class pet:
  number_of_legs = None
  age = None

  def sleep(self):
    print "zzz"

  def count_legs(self):
    print "I have %s legs." % self.number_of_legs
    return self.number_of_legs


class dog(pet):
  def bark(self):
    print "woof"

doug = dog()

doug.number_of_legs = 5;

print "Doug has %s legs." % doug.count_legs()
doug.bark()

私の質問はこれです:Pythonは緩く結合されたポリモーフィズムを持っていますか?つまり、interfaceの代わりにを使用していますかinheritance?たとえば、Javaでは、祖先関係のないクラスが同じインターフェースを実装する場合があります。次の例のHouseDogとを参照してください。PetRock

INTERFACE-ベースのポリモーフィズムJAVA

class Animal{
   int legs;
   double weight;

   public int getLegs(){return this.legs;}
   public double getWeight(){return this.weight}
}

interface Pet{
    public int getNumberOfDresses();
    public int getNumberOfToys();
}

class HouseDog extends Animal implements Pet{
   //... implementation here
}

class PetRock implements Pet{
   //a rock and a dog don't really have much in common.
   //But both can be treated as pets
}

質問:

繰り返しますが、Pythonには、継承を使用せずにポリモーフィズムを実現するオブジェクト指向の方法がありますか?

4

1 に答える 1

5

はい、彼らはそれをダックタイピングと呼んでいます。インターフェイスを正式に実装する必要はありません。Pythonには多重継承があるため、Javaスタイルのインターフェースは存在しません。したがって、インターフェースを定義する場合は、スーパータイプとして通常のクラスを使用するだけです。しかし、一般的に、人々は完全に抽象的な基本クラスを作成することを避け、ダックタイピングを利用します。

あなたの例では、Petインターフェースを省略しますが、 haveとmethodsの両方をHouseDog使用します。多態的な状況では、Pythonは、コンパイル時(存在しない)またはロード時に型をチェックするのではなく、呼び出されたときにのみメソッドの存在をチェックします。大きな利点は、実装がまだ完了していないときに、形式を気にせずに迅速にプロトタイプを作成できることです。 PetRockgetNumberOfDressesgetNumberOfToys

正式な型チェックが必要な場合は、さまざまな方法で取得できますが、正式に認可されているものはありません。

于 2012-11-24T18:36:33.693 に答える