2021年2月23日 / 99次阅读 / Last Modified 2021年2月23日
关于什么是动态语言,请参考:动态语言和静态语言
什么是动态语言的“鸭子类型”?
比如,我们写了一个函数MF(),这个函数的入参是一个特定类型的对象,这个函数就干一个事情,就是调用对象的test()函数。假设这个类型是A,B继承A,现在我们有两个对象,a和b,分比是类型A和B。
如果我们把a和b作为入参传入MF(),a和b都有test()成员函数,执行都OK。
这时,如果我们再定义一个类型C,C跟A和B没有任何关系,唯一的联系都是,C也有一个test()函数。假设c是C的一个对象,我们把c传入MF(),一样可以得到执行。
本来我们设计MF()函数,是为了传入A或B的对象,或者继承A或B的其它新的类型对象,但是,突然出现了一个C,跟A和B没有任何关系,C的对象也可以传入MF()函数。我们说C就是“鸭子类型”(A-like object)。
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。
-- EOF --
本文链接:https://www.pynote.net/archives/3551
前一篇:a is b,但 a == b不成立
后一篇:合并dict对象
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记