zoukankan      html  css  js  c++  java
  • 到底啥是鸭子类型(duck typing)带简单例子

    #百度百科鸭子类型定义

    这是程序设计中的一种类型推断风格,这种风格适用于动态语言(比如PHP、Python、Ruby、Typescript、Perl、Objective-C、Lua、Julia、JavaScript、Java、Groovy、C#等)和某些静态语言(比如Golang,一般来说,静态类型语言在编译时便已确定了变量的类型,但是Golang的实现是:在编译时推断变量的类型),支持"鸭子类型"的语言的解释器/编译器将会在解析(Parse)或编译时,推断对象的类型。

    这个解释很抽象,又拗口,最讨厌看这些解释了

     

    #容易看懂的定义

    其实动态语言是相对静态语言而言的,静态语言的特点是在程序执行前,代码编译时从代码中就可以知道一切,比如变量的类型,方法的返回值类型:

    String s = "hello"

    s = "world"

    s = 1// 编译时就会报错

    在静态语言中,变量有类型信息,它是一块内存区域,静态语言的优点是代码结构非常规范,便于调试,但有时显得啰嗦。

     

    而动态语言只有等到程序运行时才知道一切,变量(严格来说叫名字,就像人的名字一样)不需要指定类型,变量本身没有任何类型信息,类型信息在对象身上,对象是什么类型,必须等到程序运行时才知道,动态类型语言的优点在于方便阅读,不需要写很多类型相关的代码;缺点是不方便调试,命名不规范时会造成读不懂,不利于理解等。

    s = "hello"

    s = "world"

    s = 1# 可以给变量随意赋值,无论是什么类型都可以鸭子类型

     

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

    #看个例子

     

     这里面

    鸭子自然会嘎嘎的叫

    小鸟也会叫,这鸟叫声跟鸭子叫声很类似, 哇哇啾啾

    小狗也会叫,这狗叫声跟鸭子叫声也很类似,哇哇

    既然叫声都很类似,那就认为它们都是鸭子,直接指鸟为鸭,指狗为鸭,

     

    我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。

     

     

     

     #小扩展

    如果你学的是Java或者C++等静态语言,可能对鸭子类型的理解没那么深刻,因为静态语言中对象的特性取决于其父类。

     而动态语言则不一样,比如迭代器,任何实现了 __iter__ 和 __next__ 方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,可以自定义为任何类

     鸭子类型依赖文档、清晰的代码和测试来确保正确使用 。这既是优点也是缺点,缺点是需要通过文档才能知道参数类型,为了弥补这方面的不足,Python3.6 引入了类型信息,定义变量的时候可以指定类型

     

     

     

     

     #参考

    https://www.sohu.com/a/169574908_776230

    https://blog.csdn.net/IAlexanderI/article/details/80266300

  • 相关阅读:
    java中的数组
    java中的break continue
    java 自加和短路问题 几个例子
    循环语句
    K-近邻算法小结
    数据结构与算法学习笔记 (三) 排序 搜索
    数据结构与算法学习笔记 (二) 栈 链表 队列 树 堆 图 并查集
    Spark数据分析技术学习笔记(一)——基础概念、RDD使用
    Python数据分析学习笔记
    Python机器学习(Sebastian著 ) 学习笔记——第六章模型评估与参数调优实战(Windows Spyder Python 3.6)
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11699068.html
Copyright © 2011-2022 走看看