多态在Python中是如何工作的?

How does polymorphism work in Python?

我是Python的新手…来自大部分Java背景,如果这说明了什么。

我试图理解Python中的多态性。也许问题在于我期待着我已经知道的概念能够投射到Python中。但我将以下测试代码组合在一起:

1
2
3
4
5
6
7
8
9
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的EDCOX1(0)),我希望这两个语句都能打印正确,因为狗的实例是动物,也是狗。但我的输出是:

1
2
False
True

我错过了什么?


python中的is操作符检查两个参数是否引用内存中的同一对象;它与c中的is操作符不同。

来自文档:

The operators is and is not test for object identity: x is y is true if and only if x and y are the same object. x is not y yields the inverse truth value.

在这种情况下,您需要的是isinstance

Return true if the object argument is an instance of the classinfo argument, or of a (direct or indirect) subclass thereof.

1
2
3
4
5
6
7
8
9
>>> class animal(object): pass

>>> class dog(animal): pass

>>> myDog = dog()
>>> isinstance(myDog, dog)
True
>>> isinstance(myDog, animal)
True

然而,惯用的python命令您(几乎)从不进行类型检查,而是依赖duck类型来实现多态行为。使用isinstance来理解继承没有什么错误,但是在"生产"代码中通常应该避免这种情况。


菲穆厄和马克回答了你的问题。但这也是Python中多态性的一个例子,但是它不像基于继承的例子那样明确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)


试一下isinstance(myDog, dog)resp.isinstance(myDog, animal)