美文网首页
Python:动态语言与鸭子类型

Python:动态语言与鸭子类型

作者: _Cappuccino_ | 来源:发表于2020-01-19 16:34 被阅读0次

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

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

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

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
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

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

相关文章

  • python常用类方法(魔法方法)

    在谈论类方法前,我们先理解几个概念: 鸭子类型 协议 鸭子类型 python是动态的面向对象语言,动态意味着只有在...

  • Python:动态语言与鸭子类型

    今天来说说编程语言中的动态类型语言与鸭子类型,维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构...

  • python面试题

    python语言特性 python是静态还是动态类型?是强类型还是弱类型? 动态强类型语言 动态还是静态指的是编译...

  • 1.设计模式(动态语言、多态、封装、原型模式)

    1.动态语言与鸭子类型(js语言能轻松实现面向接口编程,而不是实现编程) 动态语言:编译的时候不关注数据类型,编译...

  • Python 语法(一)

    1、Python 语言特性 1.1 Python 是静态还是动态?强还是弱类型 动态强类型语言 动态还是静态:指...

  • 语法

    鸭子类型 动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If ...

  • 01 | Python 两大特性和四大基本语法

    一、 Python语言两大特性 Python是一种动态的强类型语言。 1.1 什么是动态语言? 类型检查: 验证类...

  • 面向对象的JS

    1. 动态类型和鸭子类型 编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言 静态类型...

  • 浓缩解读《JavaScript设计模式与开发实践》①

    面向对象的JavaScript 1.1 动态类型语言和鸭子类型 按照数据类型,编程语言可以分为两大类:静态类型语言...

  • python类型

    python类型 类型 python为动态强类型语言 动态,变量的类型在声明后可以改变 强类型,偏向于不容忍隐式类...

网友评论

      本文标题:Python:动态语言与鸭子类型

      本文链接:https://www.haomeiwen.com/subject/jtgrzctx.html