多态在Python中如何工作?

我是新来的Python …来自主要Java背景,如果这个帐户的东西。

我想了解Python中的多态性。 也许问题是,我期待我已经知道投影到Python的概念。 但是我把下面的testing代码放在一起:

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 

我错过了什么?

Python中的is运算符会检查这两个参数是否指向内存中的同一个对象; 它不像C#中的is运算符。

从文档 :

运算符是,而不是testing对象的身份:当且仅当x和y是同一个对象时,x是y是真的。 x不是y产生逆真值。

在这种情况下你正在寻找的是isinstance

如果object参数是一个classinfo参数的实例,或者是一个(直接或间接的)子类的实例,则返回true。

 >>> class animal(object): pass >>> class dog(animal): pass >>> myDog = dog() >>> isinstance(myDog, dog) True >>> isinstance(myDog, animal) True 

然而,惯用的Python决定了你(几乎)从来没有进行types检查,而是依赖于鸭子的多态行为。 使用isinstance来理解inheritance是没有问题的,但是通常应该在“生产”代码中避免。

phimuemue和马克已经回答了你的问题。 但是这也是Python中多态的一个例子,但它不像你的基于inheritance的例子那样明确。

 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)