Python中的多态是如何实现的?

64 投票
4 回答
48382 浏览
提问于 2025-04-15 22:42

我刚开始学习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操作符是不一样的。

根据文档

isis 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来理解继承是没问题的,但在“生产”代码中一般应该避免使用。

撰写回答