国产精品免费嫩草研究院|无遮羞动漫在线观看AV|国产麻豆精品传媒AV国产在线|村在线观看|寂寞情人1正版|韩国床震韩国床震古|精品系列专区久久

靜態(tài)屬性的陷阱 python中類與對(duì)象的命名空間、__dict__ 和 dir 在繼承中使用說明( 二 )

代碼展示2

22 # 通過對(duì)象名修改屬性(若self里 存在該屬性,是修改;若self里 不存在該屬性,是添加新屬性)23 # rec_obj1.length = 2024 # rec_obj1.temVar = 'object_over'  # 給對(duì)象中添加一個(gè)新屬性 'temVar': 'object_over'25 # 通過類名修改屬性(若類里 存在該屬性<靜態(tài)屬性>,是修改;若類里 不存在該屬性,是添加新屬性,<靜態(tài)屬性>)26 # Rectangle.length = 50   # 在類中添加一個(gè)新屬性 'length': 5027 # Rectangle.temVar = 'class_over'
總結(jié):
# 對(duì)象 = 類名()
# 實(shí)例化的過程:
# 類名() -> 會(huì)創(chuàng)造出一個(gè)對(duì)象,即創(chuàng)建了一個(gè)self變量
# 調(diào)用__init__(self)方法,類名括號(hào)里的參數(shù)會(huì)被這里接收
# 執(zhí)行__init__(self)方法
# 返回self
# 對(duì)象能做的事:
# 查看屬性(自己的屬性 和 類中靜態(tài)屬性)
# 調(diào)用方法
# __dict__ 對(duì)于對(duì)象的增刪改查操作都可以通過字典的語法進(jìn)行
# 類名能做的事:
# 實(shí)例化
 # 調(diào)用類中的屬性,也就是調(diào)用靜態(tài)屬性
# 調(diào)用方法 : 只不過要自己傳遞self參數(shù)
# __dict__ 對(duì)于類中的名字只能看 不能操作
2. 類與對(duì)象的關(guān)系(類與對(duì)象的命名空間問題)(1)類的命名空間創(chuàng)建一個(gè)類,就會(huì)自動(dòng)創(chuàng)建一個(gè)該類的命名空間,在該命名空間中存儲(chǔ)類的屬性(靜態(tài)屬性、動(dòng)態(tài)屬性(方法));
靜態(tài)屬性:直接在類中定義的變量;(靜態(tài)屬性屬于類,即屬于所有對(duì)象)
動(dòng)態(tài)屬性:在類中定義的函數(shù);(動(dòng)態(tài)屬性綁定到所有對(duì)象)
(2)對(duì)象的命名空間實(shí)例化一個(gè)對(duì)象,就會(huì)自動(dòng)創(chuàng)建一個(gè)該對(duì)象的命名空間,在該命名空間中存放對(duì)象的屬性;同時(shí),在實(shí)例化之后,就后產(chǎn)生一個(gè)指向類對(duì)象指針,用來指向當(dāng)前對(duì)象所屬類的命名空間,這樣就可以訪問類的靜態(tài)屬性與動(dòng)態(tài)屬性 。
在對(duì)象尋找屬性的過程中,優(yōu)先從對(duì)象的命名空間中搜索,然后去類的命名空間中查找,最后在父類的命名空間中查找...,若沒有找到該屬性,程序就會(huì)拋出異常 。
注:類與對(duì)象的命名空間是獨(dú)立存儲(chǔ)的
靜態(tài)屬性的陷阱 python中類與對(duì)象的命名空間、__dict__ 和 dir 在繼承中使用說明

文章插圖
 完整代碼展示:
class Family:    '''    定義一個(gè)公共賬號(hào) ,只要有人上班,就將錢存到這個(gè)賬號(hào)上    '''    share_money = 0  # 不可變數(shù)據(jù)類型做靜態(tài)屬性    native_place = ['china']    # 可變數(shù)據(jù)類型做靜態(tài)屬性    def __init__(self, role, name, salary):        self.role = role        self.name = name        self.salary = salary    def work(self):        Family.share_money += self.salary   # 將每個(gè)的錢都存放到這個(gè)公共賬號(hào)上        print('the account remains ¥%s '%Family.share_money)member1 = Family('father', 'lilei', 1000)member2 = Family('mother', 'zhanghua', 500)member1.work()  # the account remains ¥1000member2.work()  # the account remains ¥1500member1.share_money = 200   # 為自己獨(dú)立開了個(gè)小金庫(kù),并存入200元   -- 在對(duì)象member1中添加這一屬性member1.share_money += 100  # 以后就可以在自己的小金庫(kù)中存放私房錢,即總金額=200+100=300member2.share_money += 400  # 將公有賬號(hào)作為自己的私有賬號(hào),并存入400元,即總金額=1000+500+400=1900print(Family.share_money)   # 1000+500=1500print(member1.share_money)  # 200+100=300print(member2.share_money)  # 1000+500+400=1900"""可變數(shù)據(jù)類型做靜態(tài)屬性的影響:Family.native_place = 'america'# member1.native_place[0] = 'america' # 修改的是類中的native_place,會(huì)影響所有對(duì)象(同上)# member2.native_place[0] = 'america' # 修改的是類中的native_place,會(huì)影響所有對(duì)象(同上)print(member1.__dict__)print(member2.__dict__)print(Family.__dict__){'role': 'father', 'name': 'lilei', 'salary': 1000, 'share_money': 300}{'role': 'mother', 'name': 'zhanghua', 'salary': 500, 'share_money': 1900}{'__module__': '__main__', '__doc__': '\n    定義一個(gè)公共賬號(hào) ,只要有人上班,就將錢存到這個(gè)賬號(hào)上\n    ','share_money': 1500, 'native_place': ['america'], '__init__': <function Family.__init__ at 0x0000021C360084C8>,'work': <function Family.work at 0x0000021C3629C048>, '__dict__': <attribute '__dict__' of 'Family' objects>,'__weakref__': <attribute '__weakref__' of 'Family' objects>}""""""可變數(shù)據(jù)類型做靜態(tài)屬性的影響:member1.native_place = 'america'    # 重新賦值,在當(dāng)前對(duì)象的命名空間中添加這個(gè)屬性,不會(huì)影響其它對(duì)象print(member1.__dict__)print(member2.__dict__)print(Family.__dict__){'role': 'father', 'name': 'lilei', 'salary': 1000, 'share_money': 300, 'native_place': 'america'}{'role': 'mother', 'name': 'zhanghua', 'salary': 500, 'share_money': 1900}{'__module__': '__main__', '__doc__': '\n    定義一個(gè)公共賬號(hào) ,只要有人上班,就將錢存到這個(gè)賬號(hào)上\n    ','share_money': 1500, 'native_place': ['china'], '__init__': <function Family.__init__ at 0x000002E4747684C8>,'work': <function Family.work at 0x000002E4749FC048>, '__dict__': <attribute '__dict__' of 'Family' objects>,'__weakref__': <attribute '__weakref__' of 'Family' objects>}"""

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀