對類中靜態屬性訪問規則:(1)對于不可變數據類型來說,最好用類名操作靜態屬性; 若用對象名操作靜態屬性,其修改 和 重新賦值 都是獨立的(獨立的:對象與類的命名空間分開存放) 1)若用對象名第一次修改靜態屬性,首先會到類的命名空間中找到該靜態屬性的屬性值,然后在當前對象的命名空間中再做修改 2)若用對象名直接給靜態屬性重新賦值,那么直接會在當前對象的命名空間中添加這一屬性(2)對于可變數據類型來說,用對象名修改是 共享的,用對象名重新賦值是 獨立的 因為修改的是指針變量所指向內存中的值,故是 共享的!!!總結,操作靜態屬性,最好用類名操作靜態屬性;
補充:python中不可變數據類型與可變數據類型【靜態屬性的陷阱 python中類與對象的命名空間、__dict__ 和 dir 在繼承中使用說明】不可變數據類型:對于相同的值對應的內存地址是不變的;
1 a = 1 2 b = 1 3 c = 2 4 d = a + b 5 print(" id(a) = %d\n id(b) = %d\n id(c) = %d\n id(d) = %d\n" 6 % (id(a), id(b), id(c), id(d))) 7 8 """ 9 id(a) = 146156361610 id(b) = 146156361611 id(c) = 146156364812 id(d) = 146156364813 """可變的數據類型:對于相同值的內存地址是可變的;
1 al = [1, 2, 3] 2 bl = [1, 2, 3] 3 print(" id(al) = %d\n id(bl) = %d\n" % (id(al), id(bl))) 4 al.append(4) 5 bl += [4] 6 print(" id(al) = %d\n id(bl) = %d\n" % (id(al), id(bl))) 7 print(" al:%s\n bl:%s\n" % (al, bl)) 8 9 """10 id(al) = 235396500372011 id(bl) = 23539647358161213 id(al) = 235396500372014 id(bl) = 23539647358161516 al:[1, 2, 3, 4]17 bl:[1, 2, 3, 4]18 """類屬性的補充一:我們定義的類的屬性到底存到哪里了?有兩種方式查看dir(類名):查出的是一個名字列表類名.__dict__:查出的是一個字典,key為屬性名,value為屬性值二:特殊的類屬性類名.__name__ # 類的名字(字符串)類名.__doc__ # 類的文檔字符串類名.__base__ # 類的第一個父類類名.__bases__ # 類所有父類構成的元組類名.__dict__ # 類的字典屬性類名.__module__ # 類定義所在的模塊類名.__class__ # 實例對應的類(僅新式類中)3 __dict__ 與 dir() 的使用"""對象名.__dict__:查看對象的屬性(self對象中存儲的變量)類名.__dict__:查看類的屬性(在類中能看到的靜態屬性與動態屬性)dir(對象名):查看對象的所有屬性(此時包括self對象、類屬性、內置方法)dir(類名):查看類的所有屬性(不包括self對象)注:在繼承中,子類名.__dict__中看不到父類中的類屬性,但實際上包括父類的類屬性"""案例分析
class Family: ''' 定義一個公共賬號 ,只要有人上班,就將錢存到這個賬號上 ''' share_money = 0 # 不可變數據類型做靜態屬性 native_place = ['china'] # 可變數據類型做靜態屬性 def __init__(self, role, name, salary): self.role = role self.name = name self.salary = salary def work(self): Family.share_money += self.salary # 將每個人的錢都存放到這個公共賬號上 print('the account remains ¥%s '%Family.share_money) def fun(self): passclass NewFamily(Family): new_account = 0 def __init__(self, role, name, salary, kind): super(NewFamily, self).__init__(role, name, salary) self.kind = kind def work(self): pass # 使用__定義私有屬性 # python中不存在嚴格的私有屬性,在類的外部可通過正真的函數名【_類名__函數名,即 _NewFamily__expenditure】間接調用 def __expenditure(self): passf = Family('father', 'lilei', 1000)nf = NewFamily("son", "liwei", 2000, "salesman")print("-"*20, "nf.__dict__ 與 f.__dict__ 對比", "-"*20)print(f.__dict__)print(nf.__dict__)print(set(nf.__dict__) - set(f.__dict__))print("-"*20, "NewFamily.__dict__ 與 Family.__dict__ 對比", "-"*20)print(Family.__dict__)print(NewFamily.__dict__)print(set(NewFamily.__dict__) - set(Family.__dict__))print("-"*20, "dir(nf) 與 dir(f) 對比", "-"*20)print(dir(f))print(dir(nf))print(set(dir(nf)) - set(dir(f)))print("-"*20, "dir(NewFamily) 與 dir(Family) 對比", "-"*20)print(dir(Family))print(dir(NewFamily))print(set(dir(NewFamily)) - set(dir(Family)))
經驗總結擴展閱讀
- 溫度升高電阻怎么變化
- 2023年屬蛇人最佳結婚日子是哪幾天 屬蛇人結婚吉日查詢
- 2023年適合屬馬人結婚的吉日查詢 屬馬人結婚吉日查詢
- 2023年適合屬羊人結婚的吉日查詢 屬羊人結婚吉日查詢
- 2023年屬豬人結婚的良辰吉日查詢 屬豬人結婚吉日查詢
- 屬兔2023本命年年結婚好嗎挑選良辰吉日結婚安全幸福
- 美赫吊頂屬于幾線品牌?
- 88年屬龍的是什么命
- 沌口屬于武漢哪個區
- 奧迪A3適合男人開嗎
