Как работает полиморфизм в 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
что я упустил?
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)