2010-05-14 2 views
55

Я новичок в Python ... и, исходя из основного фона Java, если это что-то объясняет.Как полиморфизм работает в Python?

Я пытаюсь понять полиморфизм в 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 

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

+14

Обратите внимание, что проверка типа объекта является противоположностью полиморфизма. Полиморфизм работает на объекте независимо от его типа. –

ответ

71

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

From the docs:

Операторы это и не испытывают для идентичности объекта: х у истинно тогда и только тогда, когда х и у того же объекта. 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

Для классов, которые наследуются от 'object', вы также можете посмотреть кортеж' classname .__ mro__', но на самом деле это полезно для образовательных целей. – detly

+0

Спасибо! И yup, я делаю это только как часть учебного процесса ... редко использую instanceof в Java либо – froadie

11

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

40

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) 
+21

Иначе, как утка Собака печатает. – Santa

+1

* собака - - P – stackoverflowuser95

Смежные вопросы