在学python之前一直把动态语言和静态语言的区别理解为要写int char这样的预定义类型的就是静态语言,而可以不用事先声明数据类型的则是动态语言,直到看到了这个:
python是动态语言,实例创建出来之后仍然可以被绑定其他属性,即使类中没有规定。Java/C#是静态语言,实例创建出来后属性就固定了,有什么属性是类规定好了的,不允许改变。
当一个Student类创建之后,它的内部的字段属性只有name和score,如果在java(静态语言)中,是无法使用bart.age这样的方式给student这个类动态的添加一个字段的(可以使用继承的方式扩展一个新的含有age属性的student2类,java可以在运行时修改类中属性的值,但是无法在运行时修改student这个类中的属性的,也就是不能给它新增字段或者删掉字段):可以看到age属性为红色,代表异常,
所以个人认为动态语言和静态语言本质上的区别在于,能否在运行时“绑定”新的属性,而提前声明数据类型个人觉得属于强类型和弱类型的差别,即隐式转化。
同时动态语言还存在一种“鸭子类型”,即动态语言对继承体系要求不严格:一个对象只要“看起来像鸭子,走起路来像鸭子”那么它就可以被看作是鸭子
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:
可以看到,静态语言(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
报错pig中没有grade这个属性(方法)