62 votes

Comment fonctionne le polymorphisme en Python?

Je suis nouveau sur Python... et venant principalement de Java arrière-plan, si ce qui compte pour rien.

J'essaie de comprendre le polymorphisme en Python. Peut-être le problème, c'est que je m'attends à des concepts que je connais déjà pour projet en Python. Mais j'ai mis en place le test code 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

À partir du polymorphisme je suis utilisé (par exemple, java instanceof), je m'attends à ces deux états à imprimer vrai, comme une instance de chien est un animal et aussi est un chien. Mais mon résultat est:

False
True

Ce qui me manque?

77voto

Mark Rushakoff Points 97350

L' is opérateur en Python vérifie que les deux arguments se réfèrent au même objet en mémoire; il n'est pas comme l' is opérateur en C#.

À partir de la documentation:

Les opérateurs est et n'est pas de test pour l'identité de l'objet: x est y est vrai si et seulement si x et y sont le même objet. x n'est pas y rendements de l'inverse de la valeur de vérité.

Ce que vous cherchez dans ce cas, est - isinstance.

Retourne true si l'argument d'objet est une instance de la classinfo argument ou d'un (direct ou indirect), sous-classe de celle-ci.

>>> class animal(object): pass

>>> class dog(animal): pass

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

Cependant, idiomatiques Python dicte que vous avez (presque) jamais de faire la vérification de type, mais plutôt s'appuyer sur duck-typing pour le comportement polymorphique. Il n'y a rien de mal avec l'aide d' isinstance de comprendre l'héritage, mais il doit généralement être évitée dans la "production" du code.

42voto

Pod Points 2526

phimuemue et Mark ont répondu à votre question. Mais ceci 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)
 

11voto

phimuemue Points 11644

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X