定义
静态语言:静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,不允许再运行过程中修改代码。
例如:C++、Java、Delphi、C#等
动态语言:动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
例如:PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。
特点
强类型定义语言
强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
弱类型定义语言
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
两者区别
特性
强类型语言是一旦变量的类型被确定,就不能转化的语言。
弱类型语言则反之,一个变量的类型是由其应用上下文确定的。
静态语言的优势
由于类型的强制声明,使得IDE有很强的代码感知能力,故,在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障;
由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最低
动态语言的优势
思维不受束缚,可以任意发挥,把更多的精力放在产品本身上;
集中思考业务逻辑实现,思考过程即实现过程;
code:实例
a =100
def test():
print("---test")
a = test()
a()
#此时的函数test被赋值给了a,而a原来保存的是一个整型数字,之后被赋值给了函数,a的类型变了
class test(object):
pass
t =test()
dir(t)
#此时t应该继承了test类的所有属性,dir(t)可以将t这个实例的所有属性打印出来,之后试着为t添加属性
t.age =188888
#为t添加了一个age属性,之后再dir(t)就可以显示出来t的所有属性,此时可以看见t的属性包含了一个age,这是原来的object类里面所没有的
为类动态添加属性
class Persong(object):
def __init__ (self,newName,newAge):
self.name =newName
self.age =newAge
laowang =Person('老王来了',1000)
print(laowang.name)
print(laowang.age)
#此时尝试实例的别的属性
print(laowang.addr)
#编译器会报错,因为再初始化类的时候没有写入实例的addr属性
laowang.addr ='北京'
print(laowang.addr)
laozhao =Person('老赵',1000)
print(laozhao.addr)
#此时会报错,因为上面只是操作的一个实例,并没有对类的结构调整
给类添加属性
class Persong(object):
def __init__ (self,newName,newAge):
self.name =newName
self.age =newAge
laowang =Person('老王来了',1000)
print(laowang.name)
print(laowang.age)
laowang.addr ='北京'
print(laowang.addr)
laozhao =Person('老赵',1000)
Person.num =100
#此时为类添加了一个属性
print(laowang.num)
print(laozhao.num)
添加方法
class Person(object):
def __init__(self,newName,newAge):
self.name=newName
self.age =newAge
def eat(self):
print('%s正在吃'%self.name)
#在函数外添加一个方法,先定义一个方法
def run(self):
print('---%sz正在跑---'%self.name)
p1 =Person('p1',10)
p1.eat()
#想为一个类添加一个方法run,如下为尝试
#错误的方法
p1.run =run
p1.run()
#虽然p1对象中,run属性已经指向了函数run但是没能传入self这个变量,这句代码还不对,因为run属性指向的函数,是后来添加的,p1.run()的时候,没有把p1当作第一个参数,导致了,后面函数调用的时候,出现了参数缺少的问题
#即此时p1已经有了自己的内存空间,而且这里没有之前类添加的属性,所以p1内部没有run属性。
正确方法:
import types
class Person(object):
def __init__(self,newName,newAge):
self.name=newName
self.age =newAge
def eat(self):
print('%s正在吃'%self.name)
def run(self):
print('---%sz正在跑---'%self.name)
def eat(self):
print('---%s正在吃---')
p1.run =types.MethodType(run,p1)
p1.eat =types.MethodType(eat,p1)
p1.run()
p1.eat()
上图是types的help,可以看见使用types的方法是types.MethodType(function,instance),function就是需要添加的属性,instance就是被绑定的实例
这么写是为了将types函数的返回值保存,实际上是已经将方法添加到了,实例里面,此时通过什么保存都是可以的,但是写p1.eat是为了统一,方便理解,并不是必须写p1.eat
注意:只有动态方法是和实例绑定静态方法和类方法绑定的是类!!!!!
静态方法(绑定的是类)
我觉得静态方法就是不能接受返回值的方法,就像动态方法里面的self,就是为了接收返回值,而静态方法不管绑定在哪个类上,都没有返回值。PS:欢迎指正
@staticmethod
#类似于装饰器
def test():
print('----static methon--')
p.test =test
p.test()
类方法
@classmethod
def printNum(cls):
print('----class methon---')
p.printNum =printNum
p.printNum()
如代码所示就是使用方法,简单易懂QAQ