Python中的多态是如何实现的?
我刚开始学习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中的instanceof
),我本以为这两个语句都会输出true,因为一只狗是动物,同时也是狗。但我的输出结果是:
False
True
我错过了什么呢?
4 个回答
11
试试用 isinstance(myDog, dog)
或者 isinstance(myDog, animal)
来检查一下。
43
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)
78
在Python中,is
操作符用来检查两个参数是否指向内存中的同一个对象;这和C#中的is
操作符是不一样的。
根据文档:
is
和is not
操作符用来测试对象的身份:只有当x和y是同一个对象时,x is y
才为真。x is not y
则返回相反的真假值。
在这种情况下,你需要的是isinstance
。
如果对象参数是classinfo参数的一个实例,或者是其(直接或间接)子类的实例,则返回真。
>>> class animal(object): pass
>>> class dog(animal): pass
>>> myDog = dog()
>>> isinstance(myDog, dog)
True
>>> isinstance(myDog, animal)
True
不过,按照Python的习惯用法,通常不建议进行类型检查,而是依赖于鸭子类型来实现多态行为。使用isinstance
来理解继承是没问题的,但在“生产”代码中一般应该避免使用。