Как полиморфизм работает в 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

Что я пропускаю?

59
задан froadie 14 May 2010 в 16:23
поделиться

3 ответа

Оператор 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 для понимания наследования, но его обычно следует избегать в «производственном» коде.

73
ответ дан 24 November 2019 в 18:17
поделиться

Попробуйте isinstance(myDog, собака) resp. isinstance(myDog, животное).

11
ответ дан 24 November 2019 в 18:17
поделиться

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)
41
ответ дан 24 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: