主要针对之前的鸭子类型,我们对Python的多态的知识点进行一个总结。

多态

先看一个例子:

1
2
3
4
>>> "This is a book".count("s")
2
>>> [1,2,4,3,5,3].count(3)
2

上面的count()的作用是数一数某个元素在对象中出现的次数。从例子中可以看出,我们并没有限定count的参数。类似的例子还有:

1
2
3
4
5
6
7
>>> f = lambda x,y:x+y
>>> f(2,3)
5
>>> f("qiw","sir")
'qiwsir'
>>> f(["python","java"],["c++","lisp"])
['python', 'java', 'c++', 'lisp']

在那个lambda函数中,我们没有限制参数的类型,也一定不能限制,因为如果限制了,就不是pythonic了。在使用的时候,可以给参数任意类型,都能到的不报错的结果。当然,这样做之所以合法,更多的是来自于+的功能强悍。

其实上面的例子就体现了什么叫做多态。其实就是“有多种形式”,就算不知道变量(参数)所引用的对象类型,也一样能进行操作,来者不拒。

下面给一个关于猫和狗的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python
# coding=utf-8

"the code is from: http://zetcode.com/lang/python/oop/"

__metaclass__ = type

class Animal:
def __init__(self, name=""):
self.name = name

def talk(self):
pass

class Cat(Animal):
def talk(self):
print "Meow!"

class Dog(Animal):
def talk(self):
print "Woof!"

a = Animal()
a.talk() # 无结果

c = Cat("Missy")
c.talk() # Meow!

d = Dog("Rocky")
d.talk() # Woof!

代码中有Cat和Dog两个类,都继承了类Animal,它们都有talk()方法,输入不同的动物名称,会得出相应的结果。

备注:

可以回忆一下鸭子类型里面的内容,可以加深你的理解。