Как работает полиморфизм в Python? - PullRequest
58 голосов
/ 14 мая 2010

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

False
True

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

Ответы [ 3 ]

72 голосов
/ 14 мая 2010

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

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

Операторы проверяют и не проверяют идентичность объекта: 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 требует, чтобы вы (почти) никогда не делали проверку типов, а вместо этого полагались на duck-typing для полиморфного поведения. Нет ничего плохого в использовании isinstance для понимания наследования, но его, как правило, следует избегать в «производственном» коде.

41 голосов
/ 14 мая 2010

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)
11 голосов
/ 14 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...