多态在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)
。