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

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


對類中靜態屬性訪問規則:(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)))

經驗總結擴展閱讀