0%

Python_鸭子类型

最近在学习流畅的Python一书时,经常看到这样的名词”鸭子类型”.而对它的解释是:一只鸟如果长得像鸭子,走路像鸭子,游泳也像鸭子,那么它可以认为就是一只鸭子.

这句话乍看起来有些无厘头.于是看了下大家对鸭子类型的解释,总结如下:

上面标粗的这句话表明一件事:只关注的该对象的行为,而不关注该对象的类型.这是Python的特点,是一门动态语言.

Python默认鸭子类型的示例

像JAVA,C这种静态语言,传入对象后需要检查对象的类型,类型不符合预期会报错.而Python中并不会对类型进行限制.在日常使用中其实已经或多或少的涉及到.例如各种魔法方法

1
2
3
4
5
6
listTemp = [1,2,3]
len(listTemp)
# 3
tupleTemp = (1,2,3)
len(tupleTemp)
# 3

不管你传入的列表或者元组甚至是你自己定义的序列类别,都可以正确的输出其长度,只要你实现了__len__方法.

自定义鸭子类型示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Student(object):
def run(self):
print('BiuBiuBiu Running One!!!')

class Infor(object):
def run(self):
print('BiuBiuBiu Running Two!!!')


def runT(Student):
Student.run()

StuA=Student()
runT(StuA)
# BiuBiuBiu Running One!!!

infA=Infor()
runT(infA)
# BiuBiuBiu Running Two!!!

传入对象,只关注对象的行为能不能实现,不关注对象的类型.其实讲到这里鸭子类型就已经很明了啦.