是指在Python 的物件導向開發過程中,物件的某些屬性只想在對象的內部被使用,但不想在外部被存取到這些屬性。
即:私有屬性是物件不願意公開的屬性。
是指在Python 的物件導向開發過程中,物件的某些方法或稱為函數只想在物件的內部被使用,但不想在外部被存取到這些方法或函數。
即:私有方法是物件不願意公開的方法或函數。
在Python 中定義私有屬性和私有方法的語法如下:
class Staff: def __init__(self, s_name, s_salary): self.s_name = s_name self.__salary = s_salary def __secret(self): print("%s 的工资是 %d" % (self.s_name, self.__salary))
(1). __salary是以兩個底線開頭來定義的私有屬性。
(2). __secret(self)是以兩個底線開頭來定義的私有方法。
(1). 在__init__的物件初始化方法中,以兩個底線開頭定義的__salary屬性就是私有屬性。
現在在物件的外部來呼叫一下__salary屬性,看看是否能正常存取該私有屬性。
從上圖執行結果可以看出,第11行,即在物件外部存取物件的私有屬性__salary 時,提示AttributeError 錯誤,Staff 物件zhangsan 沒有屬性__salary。
為了證明 Staff 類別物件確實是有__salary 這個實例屬性的,只是因為在物件外部不能存取私有屬性。
我把 self.__salary 修改為:self.salary,__secret(self)方法對self.__salary屬性的引用,做對應的修改,看如下圖所示的運行結果。
可以從執行結果看出,這個非私有屬性在外部的呼叫是正常的,沒有提示 AttributeError 錯誤。
(2). 在 __secret(self) 實例方法中,以兩個底線開頭定義的__secret(self)方法就是私有方法。
和上面測試流程一樣,先在物件的外部來呼叫私有方法__secret(self),看是否能正常呼叫該私有方法。
從上圖執行結果可以看出,第11行,即在物件外部存取物件的私有方法__secret(self) 時,提示AttributeError 錯誤,Staff 對象zhangsan 沒有__secret 方法。
為了證明 Staff 類別物件是有__secret(self)這個實例方法的,只是因為在物件外部不能存取私有方法。
我把 __secret(self) 方法修改為:secret(self),其他程式碼不變,看如下圖的運行結果。
可以從執行結果看出,這種非私有方法在外部的呼叫是正常的,沒有提示 AttributeError 錯誤。
(3). 從下圖可以看出,在物件內部私有方法與私有屬性是可以被呼叫的。
如圖中的 work 方法呼叫了私有方法__secret(self),而私有方法__secret(self)呼叫了私有屬性__salary。
在物件外部使用 Staff 類別物件 zhangsan 來呼叫 work 方法,可以間接存取到物件的私有屬性和私有方法。
從控制台輸出結果來看 work 方法能正常存取到物件內部定義的私有屬性和私有方法。
在Python 中,並沒有真正意義上的私有,因為Python 內部在為屬性、方法命名時,對名稱做了一些特殊處理,使得外界無法存取對應的屬性和方法。
以私有屬性與私有方法為例,Python內部處理方式為:
(1). 屬性: __salary,經過處理後的屬性名稱為:_Staff__salary(_類別名稱__屬性名稱)
(2). 方法: __secret,經過處理後的方法名稱為:_Staff__secret(_類別名稱__方法名稱)
知道了Python 內部對於私有屬性和私有方法的處理,現在使用這種處理後的命名方式來在物件外部存取私有屬性和私有方法,看看是否能存取正常。
class Staff: def __init__(self, s_name, s_salary): self.s_name = s_name self.__salary = s_salary def __secret(self): return "%s的工资是 %d" % (self.s_name, self.__salary) zhangsan = Staff("张三", 10000) print(zhangsan._Staff__salary) print(zhangsan._Staff__secret())
運行結果如下圖所示
控制台沒有拋任何的例外,之前的提示 AttributeError 錯誤也沒有了。
這個例子證明了Python 是沒有真正意義上的私有的,當知道了其內部處理方式後,依然可以使用_類名__屬性名(方法名)的方法來在對像外部訪問到物件內部定義的私有屬性和私有方法。
但這種方式在日常工作中是不建議使用的,既然在物件內部定義屬性和方法時,就宣告了其為私有的,呼叫方就需要遵守其規則。
這裡只是想透過這個小例子來說明 Python 並無真正意義上的私有。
以上是聊聊Python私有屬性與私有方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!