一、

动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。

如果你学的是Java或者C++等静态语言,可能对鸭子类型的理解没那么深刻,因为静态语言中对象的特性取决于其父类。而动态语言则不一样,比如迭代器,任何实现了 __iter__ 和 __next__方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,可以自定义为任何类

class Foo:
def __iter__(self):
pass def __next__(self):
pass from collections import Iterable
from collections import Iterator print(isinstance(Foo(), Iterable)) # True
print(isinstance(Foo(), Iterator)) # True(python3),False(python2)

我们并不需要继承 Iterator 就可以实现迭代器的功能。当有一函数希望接收的参数是 Iterator 类型时,但是我们传递的是 Foo 的实例对象,其实也没问题,换成是Java等静态语言,就必须传递 Iterator或者是它的子类。鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用,这既是优点也是缺点,缺点是需要通过文档才能知道参数类型,为了弥补这方面的不足,Python3.6引入了类型信息,定义变量的时候可以指定类型,例如:

def greeting(name: str) -> str:
return 'Hello ' + name

该函数表示接收str类型的参数,并返回str类型的值

reference:https://foofish.net/dynamic_type_and_duck_type.html

最新文章

  1. PHP XML和数组互相转换
  2. 反射在ADO.NET中的运用(你还在每个项目中循环遍历DataTable吗)
  3. Crowd 2.7汉化中文包(原创首发)
  4. react项目组件化思考
  5. 获取网页URL地址及参数等的两种方法(js和C#)
  6. Java将Unix时间戳转换成指定格式日期
  7. 瞬间从IT屌丝变大神——HTML规范
  8. 在ubuntu14.04上编译android4.2.2系统
  9. JS操作JSON总结(转)
  10. aspx.cs上传文件
  11. shell程序设计(转)
  12. Routing路由
  13. python的with语句,超级强大
  14. opengl启动过程
  15. vue 导航守卫,验证是否登录
  16. 买卖股票的最佳时机II
  17. Android Studio 学习Demo内容及一些bug处理技巧 -----个人技术文档,两次冲刺总结
  18. 牛客练习赛43-F(简单容斥)
  19. Delphi XE中String、ANSIString、TBytes之间的转换
  20. super函数的用法

热门文章

  1. 用GitHub Issue取代多说,是不是很厉害?
  2. C# SqlBulkCopy类批量导入 测试
  3. js 金额补全处理
  4. js 处理金额各个位数上的值
  5. redis中各种数据类型的常用操作方法汇总
  6. c++趣味之变量名,颠覆所有教科书的VisualStudio
  7. 智能ERP 交接班统计异常的解决方法
  8. [20190320]测试相同语句遇到导致cursor pin S的情况.txt
  9. js强制不使用“兼容性视图”
  10. C#编辑EXE使用的appSettings节点的Config文件