动态语言静态语言及动态语言的“鸭子类型“
Posted dfdn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态语言静态语言及动态语言的“鸭子类型“相关的知识,希望对你有一定的参考价值。
动态语言与静态语言:
所谓动态和静态,是指程序中类型。类型又是指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()方法的对象。
以上是关于动态语言静态语言及动态语言的“鸭子类型“的主要内容,如果未能解决你的问题,请参考以下文章