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

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()方法的对象。


以上是关于动态语言静态语言及动态语言的“鸭子类型“的主要内容,如果未能解决你的问题,请参考以下文章

python的鸭子类型与多态

Python语言基础常考题

python面试总结1(基础章节)

JavaScript设计模式基础之面向对象的JavaScript

Python语言基础

获取属性以及基本方法