Подтвердить что ты не робот

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

False
True

Что мне не хватает?

4b9b3361

Ответ 1

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

Из документов:

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

В этом случае вы ищете isinstance.

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

>>> class animal(object): pass

>>> class dog(animal): pass

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

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

Ответ 2

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)

Ответ 3

Попробуйте isinstance(myDog, dog) соответственно. isinstance(myDog, animal).