动态语言是在运行时肯定数据类型的语言。变量使用以前不须要类型声明,一般变量的类型是被赋值的那个值的类型。如今比较热门的动态语言有:Python、PHP、JavaScript、Objective-C等,而 C 、 C++ 等语言则不属于动态语言。函数
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age p = Person("小明","24") print(p.name) print(p.age)
运行结果为:spa
小明
24
这里咱们只定义了name和age两个属性,可是在类已经定义好了以后,咱们仍然能够往里面添加属性,这就是动态语言的好处,动态的给实例绑定属性:code
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age p = Person("小明","24") print(p.name) print(p.age) #动态添加属性 p.sex = "男" print(p.sex)
运行结果为:对象
小明
24
男
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age P1 = Person("小明",24) print(P1.sex)
运行结果为:blog
Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\test.py", line 8, in <module> print(P1.sex) AttributeError: 'Person' object has no attribute 'sex'
这是程序报错说,Person没有sex这个属性,咱们能够经过给Person动态绑定属性,解决问题继承
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age P1 = Person("小明",24) #动态给类添加属性 Person.sex = "男" print(P1.sex)
这个时候在运行就不会出错,并且会打印出P1.sex为男ip
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age def eat(self): print("正在吃东西") P1 = Person("小明",24) P1.eat() P1.run()
运行结果为:it
正在吃东西 Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\test.py", line 11, in <module> P1.run() AttributeError: 'Person' object has no attribute 'run'
说明:正在吃东西打印出来了,说明eat函数被执行,可是后面报错说没有run这个属性,可是我想在类建立好了之后,在运行的时候动态的添加run方法怎么办呢?编译
#动态添加方法须要导入types模块 import types class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age def eat(self): print("正在吃东西") #定义好须要动态添加的方法 def run(self): print("在跑步") P1 = Person("小明",24) #正常调用类里面的函数 P1.eat() #给对象动态绑定方法 P1.run = types.MethodType(run,P1) #对象调用动态绑定的方法 P1.run()
运行结果为:ast
正在吃东西
在跑步
打印出来“在跑步”说明run方法被正常执行了
动态绑定类方法和静态方法
#动态添加方法须要导入types模块 import types class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age def eat(self): print("正在吃东西") #定义好须要动态添加的实例方法 def run(self): print("在跑步") #定义好须要动态添加的类方法 @classmethod def dynamicClassMethod(cls): print("这是一个动态添加的类方法") #定义好须要动态添加的静态方法 @staticmethod def dynamicStaticMethod(): print("这是一个动态添加的静态方法") P1 = Person("小明",24) #正常调用类里面的函数 P1.eat() #给对象动态绑定方法 #MethodType(参数1,参数2) #参数1:是动态绑定哪一个方法,只写方法名便可 #参数2:是把这个方法动态的绑定给谁 P1.run = types.MethodType(run,P1) P1.run() #动态绑定类方法的使用 Person.dynamicClassMethod = dynamicClassMethod Person.dynamicClassMethod() #动态绑定静态方法的使用 Person.dynamicStaticMethod = dynamicStaticMethod Person.dynamicStaticMethod()
总结:
删除的方法:
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age P1 = Person("小明",24) print("---------删除前---------") print(P1.name) del P1.name print("---------删除后---------") print(P1.name)
运行结果为:
---------删除前--------- 小明 ---------删除后--------- print(P1.name)AttributeError: 'Person' object has no attribute 'name'
动态语言:能够在运行的过程当中,修改代码
静态语言:编译时已经肯定好代码,运行过程当中不能修改
若是咱们想要限制实例的属性怎么办?好比,只容许对Person实例添加name和age属性。
为了达到限制的目的,Python容许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
class Person(object): __slots__=("name","age") p = Person() p.name = "老王" p.age = 40 print(p.name) print(p.age) #slots以外的属性 p.sex = "男" print(p.sex)
运行结果为:
老王 40 p.sex = "男" AttributeError: 'Person' object has no attribute 'sex'