這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Python動(dòng)態(tài)語言的特性有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)專注于茌平企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城開發(fā)。茌平網(wǎng)站建設(shè)公司,為茌平等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
一、動(dòng)態(tài)語言的定義
動(dòng)態(tài)語言是在運(yùn)行時(shí)確定數(shù)據(jù)類型的語言。變量使用之前不需要類型聲明,通常變量的類型是被賦值的那個(gè)值的類型。現(xiàn)在比較熱門的動(dòng)態(tài)語言有:Python、PHP、JavaScript、Objective-C等,而 C 、 C++ 等語言則不屬于動(dòng)態(tài)語言。
二、運(yùn)行的過程中給對象綁定(添加)屬性
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)
運(yùn)行結(jié)果為:
小明 24
這里我們只定義了name和age兩個(gè)屬性,但是在類已經(jīng)定義好了之后,我們?nèi)匀豢梢酝锩嫣砑訉傩裕@就是動(dòng)態(tài)語言的好處,動(dòng)態(tài)的給實(shí)例綁定屬性:
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) #動(dòng)態(tài)添加屬性 p.sex = "男" print(p.sex)
運(yùn)行結(jié)果為:
小明 24 男
三、運(yùn)行的過程中給類綁定(添加)屬性
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age P1 = Person("小明",24) print(P1.sex)
運(yùn)行結(jié)果為:
Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\test.py", line 8, inprint(P1.sex) AttributeError: 'Person' object has no attribute 'sex'
這是程序報(bào)錯(cuò)說,Person沒有sex這個(gè)屬性,我們可以通過給Person動(dòng)態(tài)綁定屬性,解決問題。
class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age P1 = Person("小明",24) #動(dòng)態(tài)給類添加屬性 Person.sex = "男" print(P1.sex)
這個(gè)時(shí)候在運(yùn)行就不會出錯(cuò),而且會打印出P1.sex為男。
四、運(yùn)行的過程中給類綁定(添加)方法
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()
運(yùn)行結(jié)果為:
正在吃東西 Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\test.py", line 11, inP1.run() AttributeError: 'Person' object has no attribute 'run'
說明:正在吃東西打印出來了,說明eat函數(shù)被執(zhí)行,但是后面報(bào)錯(cuò)說沒有run這個(gè)屬性,但是我想在類創(chuàng)建好了以后,在運(yùn)行的時(shí)候動(dòng)態(tài)的添加run方法怎么辦呢?
#動(dòng)態(tài)添加方法需要導(dǎo)入types模塊 import types class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age def eat(self): print("正在吃東西") #定義好需要?jiǎng)討B(tài)添加的方法 def run(self): print("在跑步") P1 = Person("小明",24) #正常調(diào)用類里面的函數(shù) P1.eat() #給對象動(dòng)態(tài)綁定方法 P1.run = types.MethodType(run,P1) #對象調(diào)用動(dòng)態(tài)綁定的方法 P1.run()
運(yùn)行結(jié)果為:
正在吃東西 在跑步
打印出來“在跑步”說明run方法被正常執(zhí)行了
動(dòng)態(tài)綁定類方法和靜態(tài)方法
#動(dòng)態(tài)添加方法需要導(dǎo)入types模塊 import types class Person(object): def __init__(self,name=None,age=None): self.name=name self.age=age def eat(self): print("正在吃東西") #定義好需要?jiǎng)討B(tài)添加的實(shí)例方法 def run(self): print("在跑步") #定義好需要?jiǎng)討B(tài)添加的類方法 @classmethod def dynamicClassMethod(cls): print("這是一個(gè)動(dòng)態(tài)添加的類方法") #定義好需要?jiǎng)討B(tài)添加的靜態(tài)方法 @staticmethod def dynamicStaticMethod(): print("這是一個(gè)動(dòng)態(tài)添加的靜態(tài)方法") P1 = Person("小明",24) #正常調(diào)用類里面的函數(shù) P1.eat() #給對象動(dòng)態(tài)綁定方法 #MethodType(參數(shù)1,參數(shù)2) #參數(shù)1:是動(dòng)態(tài)綁定哪個(gè)方法,只寫方法名即可 #參數(shù)2:是把這個(gè)方法動(dòng)態(tài)的綁定給誰 P1.run = types.MethodType(run,P1) P1.run() #動(dòng)態(tài)綁定類方法的使用 Person.dynamicClassMethod = dynamicClassMethod Person.dynamicClassMethod() #動(dòng)態(tài)綁定靜態(tài)方法的使用 Person.dynamicStaticMethod = dynamicStaticMethod Person.dynamicStaticMethod()
總結(jié):
1.給對象綁定屬性直接在使用前進(jìn)行賦值使用即可。
2.給對象動(dòng)態(tài)綁定方法需要import types模塊。
3.給對象動(dòng)態(tài)綁定實(shí)例方法,需要使用type.MethodType()方法。
4.給類添加類方法和靜態(tài)方法,也是直接在使用前賦值即可使用。
五、運(yùn)行的過程中刪除屬性、方法
刪除的方法:
1.del 對象.屬性名
2.delattr(對象, "屬性名")
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)
運(yùn)行結(jié)果為:
---------刪除前--------- 小明 ---------刪除后--------- print(P1.name)AttributeError: 'Person' object has no attribute 'name'
六、__slots__
動(dòng)態(tài)語言:可以在運(yùn)行的過程中,修改代碼。
靜態(tài)語言:編譯時(shí)已經(jīng)確定好代碼,運(yùn)行過程中不能修改。
如果我們想要限制實(shí)例的屬性怎么辦?比如,只允許對Person實(shí)例添加name和age屬性。
為了達(dá)到限制的目的,Python允許在定義class的時(shí)候,定義一個(gè)特殊的__slots__變量,來限制該class實(shí)例能添加的屬性:
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)
運(yùn)行結(jié)果為:
老王 40 p.sex = "男" AttributeError: 'Person' object has no attribute 'sex'
注意:
使用__slots__要注意,__slots__定義的屬性僅對當(dāng)前類實(shí)例起作用,對繼承的子類是不起作用的。
上述就是小編為大家分享的Python動(dòng)態(tài)語言的特性有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。