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理解继承没有任何问题,但在"生产"代码中通常应该避免使用它.
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)