Как работает полиморфизм в 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), Я ожидал бы, что оба этих утверждения напечатают true, как экземпляр dog это животные а также это собака. Но мой вывод:



False
True


что я упустил?

366   3  

3 ответов:

The is оператор в Python проверяет, что два аргумента ссылаются на один и тот же объект в памяти; это не похоже на is оператор в C#.

документы:

операторы являются и не являются проверкой идентичности объекта: x является y истинно тогда и только тогда, когда x и y являются одним и тем же объектом. x не y дает обратное значение истинности.

то, что вы ищете в данном случае isinstance.

возвращает true, если аргумент объекта является экземпляром аргумента classinfo или его подкласса (прямого или косвенного).

>>> class animal(object): pass

>>> class dog(animal): pass

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

однако идиоматический Python диктует, что вы (почти) никогда не выполняете проверку типа, а вместо этого полагаетесь на утка-типирование для полиморфного поведения. Нет ничего плохого в использовании isinstance чтобы понять наследование, но его обычно следует избегать в " производстве" код.

phimuemue и Марк ответили на ваш вопрос. Но это также пример полиморфизма в 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).

    Ничего не найдено.

Добавить ответ:
Отменить.