Python:动态语言与鸭子类型

开发 开发工具
今天来说说编程语言中的动态类型语言与鸭子类型,鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。

[[203303]]

今天来说说编程语言中的动态类型语言与鸭子类型,维基百科对动态语言的定义:

动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力如PHP、Ruby、Python 都属于动态语言,而C、C++、Java等语言则不属于动态语言。

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

  1. String s = "hello" 
  2. s = "world" 
  3. s = 1 // 编译时就会报错 

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

  1. s = "hello" 
  2. s = "world" 
  3. s = 1  # 可以给变量随意赋值,无论是什么类型都可以 

鸭子类型

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

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

  1. # python3 
  2. class Foo: 
  3.     def __iter__(self): 
  4.         pass 
  5.  
  6.     def __next__(self): 
  7.         pass 
  8.  
  9. from collections import Iterable 
  10. from collections import Iterator 
  11.  
  12. print(isinstance(Foo(), Iterable)) # True 
  13. print(isinstance(Foo(), Iterator)) # True 

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

【本文是51CTO专栏作者“刘志军”的原创文章,作者微信公众号:Python之禅(VTtalk)】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2022-04-11 07:51:53

鸭子类型猴子补丁Python

2021-07-02 06:54:45

面试鸭子类型

2010-02-02 16:22:37

Python动态类型语

2023-10-27 08:34:46

PythonJava优势

2014-12-23 09:34:47

动态语言

2020-08-31 19:17:24

Python强类型语言弱类型语言

2021-10-17 18:54:40

Python定义使用

2012-03-26 10:06:13

语言开发

2010-02-23 14:55:00

Python动态语言

2021-05-21 09:01:56

Python继承多态

2011-07-22 13:58:48

java接口

2009-10-13 09:05:45

反射机制

2010-07-08 10:03:39

动态语言PythonRuby

2011-01-06 09:00:01

静态语言动态语言

2009-06-14 21:54:37

动态语言Java脚本API

2018-08-01 15:10:02

GolangPython语言

2013-07-09 14:41:58

C动态类型

2010-03-23 09:16:43

Python源码剖析

2021-11-05 12:40:43

Python类型语言代码

2009-08-12 16:01:32

C#动态改变数据
点赞
收藏

51CTO技术栈公众号