多态如何在Python中工作?

fro*_*die 59 python polymorphism

我是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
Run Code Online (Sandbox Code Playgroud)

从我习惯的多态性(例如java的instanceof),我希望这两个语句都打印为true,因为dog的一个例子动物,也是一只狗.但我的输出是:

False
True
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Mar*_*off 73

isPython中的运算符检查两个参数是否引用内存中的同一对象; 它不像isC#中的运算符.

来自文档:

运算符是和不是对象标识的测试:当且仅当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
Run Code Online (Sandbox Code Playgroud)

然而,惯用的Python规定你(几乎)从不进行类型检查,而是依赖于duck-typing来进行多态行为.使用isinstance理解继承没有任何问题,但在"生产"代码中通常应该避免使用它.

  • 对于继承自`object`的类,你也可以查看`classname .__ mro__`元组,但实际上,这对于教育目的更有用. (2认同)

Pod*_*Pod 41

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)
Run Code Online (Sandbox Code Playgroud)

  • 否则称为<strike> duck </ strike>狗打字. (21认同)

phi*_*mue 11

试试吧isinstance(myDog, dog).isinstance(myDog, animal).