Как полиморфизм работает в 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
Что мне не хватает?
Ответы
Ответ 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)
.