动态语言、静态语言及动态语言的“鸭子类型“

动态语言与静态语言:

所谓动态和静态,是指程序中类型。类型又是指class,int等定义,比如变量的类型,函数的入参类型,返回值类型。动态类型语言,表示在编写程序的时候,无需制定类型,是运行时检查;静态类型语言,表示在编写程序的时候,需要显式地制定各种类型,在编译的时候就会被检查。

有人说静态类型语言叫强类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。

例如C/C++/Java/C#

有人说动态类型语言叫弱类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的)。

例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等

Python是动态类型语言,官方的说法是Dynamic Typing

拿Python来举例:动态语言中的变量无需申明,赋值时也不需要制定类型,任何时候都可以改变其指向的类型,函数的返回值也不固定,不同的入参得到的可以是不同类型的返回值。

动态语言的“鸭子类型”:

什么是动态语言的“鸭子类型”?

比如,我们写了一个函数Test_Duck(),这个函数的入参是一个特定类型的对象(本例为Animal类型),这个函数就干一个事情,就是调用对象的run()函数。假设这个类型是Dog,Dog继承Animal,现在我们有两个对象,dog和animal,分比是类型Dog和Animal。

如果我们把a和b作为入参传入Test_Duck(),Dog和Animal都有run()成员函数,执行都OK。

这时,如果我们再定义一个类型Test,Test跟Animal和Dog没有任何关系,唯一的联系都是,Test也有一个run()函数。假设test是Test的一个对象,我们把test传入Test_Duck(),一样可以得到执行。

本来我们设计Test_Duck()函数,是为了传入Dog和Animal的对象,或者继承Dog和Animal的其它新的类型对象,但是,突然出现了一个Test,跟Dog和Animal没有任何关系,Test的对象也可以传入Test_Duck()函数。我们说Test就是“鸭子类型”(A-like object)。

class Animal(object):
    def run(self):
        print(‘Animal is running‘)

class Dog(Animal):
    def run(self):
        print(‘Dog is running ‘)

class Test(Animal):
    def run(self):
        print(‘Test is right‘)

def Test_Duck(animal):
    animal.run()

dog = Dog()
dog.run()

test = Test()

Test_Duck(test)

运行结果为:

================== RESTART: E:/Python_pro/LXF/Class_Run.py ==================
Dog is running
Test is right

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。

原文地址:https://www.cnblogs.com/dfdn/p/9347616.html

时间: 2024-10-24 18:13:26

动态语言、静态语言及动态语言的“鸭子类型“的相关文章

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎

python语言的鸭子类型和强类型语言的多态

前面讲接口类的时候举过一个有关支付方式的例子,支付方式可以有几种,微信支付,支付宝支付,苹果支付等,这几个不同的支付都统一于支付,像这样几个类都统一于 某一个类或者某一个方法,或者说一个类有不同的形态的情况就属于多态:虽然几种支付方式都归一于支付类,执行的方法一样,但是每一个支付方式都有自己的特性,实现的 形态也不一样,即为多态性. class Payment: # 必要的父类 def pay(self,money): pass class Wechatpay(Payment): # 子类继承父

静态库和动态库

简介 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 为什么制作闭源库 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等 在企业开发中,一些核心技术或者常用框架,出于安全性和稳

Linux 下动态库 / 静态库(依赖)

一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而main.exe又调用了libfun.so的函数int nothing(). 下面两种方式都能工作: 1> 常用的方式 g++ -shared -fPIC -o libtest.so test.cpp g++ -shared -fPIC -o libfun.so function.cpp  -L./ -I

Linux库函数制作(静态库、动态库)

Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依赖性较小,具有较好的兼容性 缺点: 生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间 库函数有了更新,必须重新编译应用程序 动态链接: 连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序 动态链接的特点: 优点: 在需要的时候才会调入对应的资

C++基础知识之动态库静态库

一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.因此,使用了静态库的可执行程序存储在磁盘上的空间就比较大. 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在. 静态库和动态库命名规范: linux: 静态库文件名的命名规范是

face++静态库转为动态库

前言 苹果商店上架应用,有规定支持iOS8.0以上的iPA可执行文件的大小不能超过60M. face++提供过来的是静态库,会导致苹果上架的ipa的包增加1.5M左右.而刚好我们的APP包Mach-O文件大小接近60M,因而,最好的方式是通过动态库的方式来接入. Face++文件: https://faceid.com/pages/documents/37661898 SDK需要问Face++的人拿,Demo跑起来是需要key和secret的 静态库转动态库 静态库转动态库,有两种转换方式,一是

使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

嵌入式 Linux C语言(十)——静态库函数和动态库函数

嵌入式 Linux C语言(十一)--静态库函数和动态库函数 一.静态链接库 静态链接库是obj文件的一个集合,通常静态链接库以".a"为后缀,名字格式一般为libxxx.a,由程序ar生成.静态链接库是在程序编译过程中链接的,已经将调用的相关函数拷贝到程序内部,程序运行时和静态链接库已经没有任何关系. 1.静态链接库的创建 A.编写源码库文件 源码库文件一般包含.c和.h文件, hello.c文件: #include <stdio.h> void display(void

什么是静态语言,什么是动态语言?

定义 通常我们所说的动态语言.静态语言指 动态类型语言(Dynamically Typed Language)和 静态类型语言Statically Typed Language). 还有一个 Dynamic Programming Language (动态编程语言),静态编程语言. 动态类型语言:在运行期间检查数据的类型的语言.用这类语言编程,不会给变量指定类型,而是在附值时得到数据类型.   === >脚本语言等弱类型语言 静态类型语言:相反静态类型语言是在运行前编译时检查类型.    ==>