動態語言是在運行時肯定數據類型的語言。變量使用以前不須要類型聲明,一般變量的類型是被賦值的那個值的類型。如今比較熱門的動態語言有: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'