私は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
私は何が欠けていますか?
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
継承を理解しますが、一般に「本番」コードでは避ける必要があります。
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)
isinstance(myDog, dog)
を試してください。 isinstance(myDog, animal)
。