在学python之前一直把动态语言和静态语言的区别理解为要写int char这样的预定义类型的就是静态语言,而可以不用事先声明数据类型的则是动态语言,直到看到了这个:

Python语言是一种静态性语言 python 静态语言_python

Python语言是一种静态性语言 python 静态语言_Python语言是一种静态性语言_02

python是动态语言,实例创建出来之后仍然可以被绑定其他属性,即使类中没有规定。Java/C#是静态语言,实例创建出来后属性就固定了,有什么属性是类规定好了的,不允许改变。

当一个Student类创建之后,它的内部的字段属性只有name和score,如果在java(静态语言)中,是无法使用bart.age这样的方式给student这个类动态的添加一个字段的(可以使用继承的方式扩展一个新的含有age属性的student2类,java可以在运行时修改类中属性的值,但是无法在运行时修改student这个类中的属性的,也就是不能给它新增字段或者删掉字段):可以看到age属性为红色,代表异常,

Python语言是一种静态性语言 python 静态语言_Python语言是一种静态性语言_03

所以个人认为动态语言和静态语言本质上的区别在于,能否在运行时“绑定”新的属性,而提前声明数据类型个人觉得属于强类型和弱类型的差别,即隐式转化。


同时动态语言还存在一种“鸭子类型”,即动态语言对继承体系要求不严格:一个对象只要“看起来像鸭子,走起路来像鸭子”那么它就可以被看作是鸭子

python:(python中的继承是直接将父类当作参数传给子类)

class Student():
    def grade(self):
        print('哇要考试啦!')


class goodStudent(Student):
    def grade(self):
        print('哇满分!')


class badStudent(Student):
    def grade(self):
        print('哇零分')


class Pig():
    def grade(self):
        print('精品猪肉!')


def kind(student):
    student.grade()


student = Student()
good = goodStudent()
bad = badStudent()
pig = Pig()
kind(student)
kind(good)
kind(bad)
kind(pig)

Java:

Python语言是一种静态性语言 python 静态语言_Python语言是一种静态性语言_04

Python语言是一种静态性语言 python 静态语言_数据类型_05

可以看到,静态语言(java)是没有python那样的鸭子类型的特性的 


以上观点部分为个人观点以及部分引自廖雪峰python教程及知乎相关话题,python代码则引自python教程,java代码为自己手打,如有错漏之处,希望大家能够指出,互相探讨,共同进步。                  ----2018.2.24


经过几天的思考,发现,其实把动静态语言归纳为需要提前声明类型也是有道理的,因为它们的外在表现确实是这样,这里要明确一个概念就是当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和python自带的数据类型,比如str,list,dict没什么两样:

a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型

所以python可以直接把pig传入kind方法(即便kind方法已经声明了参数类型为student),但是因为是动态语言,所以在编译时不会报错,并且在运行时,发现pig也有grade这个方法("鸭子类型"),所以能够正常运行,如果pig没有grade这个方法则在运行的时候会报错                                       更新时间--2018.2.26

Python语言是一种静态性语言 python 静态语言_python_06

Python语言是一种静态性语言 python 静态语言_python_07

报错pig中没有grade这个属性(方法)