web-dev-qa-db-fra.com

Comment fonctionne le polymorphisme en Python?

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?

59
froadie

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 #.

À partir des documents :

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".

73
Mark Rushakoff

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)
41
Pod

Essayez isinstance(myDog, dog) resp. isinstance(myDog, animal).

11
phimuemue