Я плохо знаком с 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
Что я пропускаю?
Оператор is
в Python проверяет, что два аргументы относятся к одному и тому же объекту в памяти; это не похоже на оператор is
в C #.
Операторы is и not проверяют идентичность объекта: x is y истинно тогда и только тогда, когда x и y являются одним и тем же объектом. x is not y дает значение обратной истинности.
В данном случае вы ищете isinstance
.
Вернуть истину, если аргумент объекта является экземпляром аргумента classinfo или его (прямого или косвенного) подкласса.
>>> class animal(object): pass
>>> class dog(animal): pass
>>> myDog = dog()
>>> isinstance(myDog, dog)
True
>>> isinstance(myDog, animal)
True
Однако идиоматический Python диктует, что вы (почти) никогда не выполняете проверку типов, а вместо этого полагаетесь на duck-typing для полиморфного поведения. Нет ничего плохого в использовании isinstance
для понимания наследования, но его обычно следует избегать в «производственном» коде.
Попробуйте isinstance(myDog, собака)
resp. isinstance(myDog, животное)
.
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)