Je suis nouveau sur Python ... et venant d'un arrière-plan principalement Java, si cela explique quelque chose.
J'essaie de comprendre le polymorphisme en Python. Peut-être que le problème est que je m'attends à ce que les concepts que je connais déjà soient projetés dans Python. Mais j'ai rassemblé le code de test suivant:
class animal(object):
"empty animal class"
class dog(animal):
"empty dog class"
myDog = dog()
print myDog.__class__ is animal
print myDog.__class__ is dog
D'après le polymorphisme auquel je suis habitué (par exemple instanceof
de Java), je m'attendrais à ce que ces deux déclarations soient vraies, comme une instance de chien est un animal et aussi est un chien. Mais ma sortie est:
False
True
Qu'est-ce que je rate?
L'opérateur is
en Python vérifie que les deux arguments se réfèrent au même objet en mémoire; ce n'est pas comme l'opérateur is
en C #.
L'opérateur est et n'est pas un test d'identité d'objet: x est y est vrai si et seulement si x et y sont le même objet. x n'est pas y donne la valeur de vérité inverse.
Ce que vous recherchez dans ce cas est isinstance
.
Renvoie vrai si l'argument objet est une instance de l'argument classinfo ou d'une sous-classe (directe ou indirecte) de celui-ci.
>>> class animal(object): pass
>>> class dog(animal): pass
>>> myDog = dog()
>>> isinstance(myDog, dog)
True
>>> isinstance(myDog, animal)
True
Cependant, idiomatique Python dicte que vous (presque) ne faites jamais de vérification de type, mais comptez plutôt sur duck-typing pour le comportement polymorphe. Il n'y a rien de mal à utiliser isinstance
pour comprendre l'héritage, mais il doit généralement être évité dans le code "production".
phimuemue et Mark ont répondu à votre question. Mais c'est AUSSI un exemple de polymorphisme en Python, mais ce n'est pas aussi explicite que votre exemple basé sur l'héritage.
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)
Essayez isinstance(myDog, dog)
resp. isinstance(myDog, animal)
.