web-dev-qa-db-ja.com

Pythonではポリモーフィズムはどのように機能しますか?

私はPythonが初めてで、ほとんどJavaバックグラウンドから来ています。

Pythonのポリモーフィズムを理解しようとしています。たぶん問題は、私がすでに知っている概念がPythonに投影されることを期待していることです。しかし、次のテストコードをまとめました。

class animal(object):
    "empty animal class"

class dog(animal):
    "empty dog class"

myDog = dog()
print myDog.__class__ is animal
print myDog.__class__ is dog

私が慣れているポリモーフィズム(たとえばJavaのinstanceof)から、これらのステートメントの両方が、犬のインスタンスとしてis an animalであり、またa犬です。しかし、私の出力は次のとおりです。

False
True

私は何が欠けていますか?

59
froadie

Pythonのis演算子は、2つの引数がメモリ内の同じオブジェクトを参照していることを確認します。C#のis演算子とは異なります。

ドキュメントから

演算子は、オブジェクトの同一性のテストであり、テストではありません。xとyが同じオブジェクトである場合にのみ、x is yはtrueです。 xがyではない場合、逆の真理値が得られます。

この場合、探しているのは isinstance です。

オブジェクトの引数がclassinfo引数のインスタンス、またはその(直接または間接の)サブクラスのインスタンスである場合、trueを返します。

>>> class animal(object): pass

>>> class dog(animal): pass

>>> myDog = dog()
>>> isinstance(myDog, dog)
True
>>> isinstance(myDog, animal)
True

しかし、慣用的なPythonは、ほとんど(ほとんど)型チェックを行わず、代わりに duck-typing に依存して多態的な振る舞いをします。isinstance継承を理解しますが、一般に「本番」コードでは避ける必要があります。

73
Mark Rushakoff

phimuemueとMarkがあなたの質問に答えました。しかし、これはPythonのポリモーフィズムの例でもありますが、継承ベースの例ほど明確ではありません。

class wolf(object): 
    def bark(self):
        print "hooooowll"

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


def barkforme(dogtype):
    dogtype.bark()


my_dog = dog()
my_wolf = wolf()
barkforme(my_dog)
barkforme(my_wolf)
41
Pod

isinstance(myDog, dog)を試してください。 isinstance(myDog, animal)

11
phimuemue