公共屬性
在 Python 的類里面,所有屬性和方法默認都是公共的
class PoloBlog: # 公共屬性 sum = 0 # 構造方法 def __init__(self, name): self.name = name # 公共方法 def test(self): ...
但Python也可以設置受保護、私有類型的變量or方法
私有類型的屬性、方法
- 在實際開發中,對象的某些屬性或方法可能只希望在對象的內部被使用,而不希望在外部被訪問到
- 私有屬性:就是對象不希望公開訪問的屬性
- 私有方法:就是對象不希望公開訪問的方法
定義方式,類圖
在屬性、方法名前加兩個下划線就是私有屬性、私有方法了

代碼
# 私有屬性、方法 class Person: # 構造方法 def __init__(self, name, age): self.name = name self.__age = age # 實例方法 def pinrtMsg(self): print("name:", self.name, " age:", self.__age) # 私有方法 def __getAge(self): print("age is ", self.__age) person = Person("小菠蘿", 24) # 直接調用私有屬性、私有方法 - 會報錯 print(person.__age) print(person.__getAge) # 輸出結果 print(person.__age) AttributeError: 'Person' object has no attribute '__age' print(person.__getAge) AttributeError: 'Person' object has no attribute '__getAge'
看看 Pycharm 的代碼聯想


壓根不會聯想,因為是私有屬性、私有方法,不允許在對象外部被使用
通過公共方法訪問私有屬性
person = Person("小菠蘿", 24) person.printMsg() # 輸出結果 name: 小菠蘿 age: 24
類屬性私有化
# 類屬性的私有化 class Person: __sum = 0 @classmethod def getSum(cls, num): # 調用私有類方法 cls.__sumAdd(num) print(cls.__sum) @classmethod def __sumAdd(cls, num): cls.__
重點
- 子類無法訪問父類的私有變量、方法
- 私有變量只有本類的內部能直接調用
- But!外部真的不能訪問嗎?
偽私有屬性和私有方法
- 其實 Python 中,並沒有真正意義上的私有,仍然可以在外部訪問私有屬性、私有方法
- 因為,在給私有屬性、方法命名時,實際是對名稱做了一些特殊處理,使得外界無法訪問到
- 處理方式:在名稱前面加上 _類名 ,私有屬性、方法就會變成 _類名__名稱
# 間接調用 class Person: __sum = 0 # 構造方法 def __init__(self, name): self.__name = name # 私有方法 def __getName(self): print("name is ", self.__name) # 調用類私有屬性 print(Person._Person__sum) person = Person("小菠蘿") # 調用私有屬性 print(person._Person__name) # 調用私有方法 person._Person__getName() # 輸出結果 0 小菠蘿 name is 小菠蘿
無論是類對象還是實例對象,都可以通過 ._類名__名稱 來調用私有屬性、方法,這算是一種間接調用
受保護類型的屬性、方法
- 受保護類型一般會稱為:protect 屬性,學過 Java 的應該都了解
- 在屬性和方法前加一個下划線就是 protect 類型了,私有類型是兩個下划線
# 受保護類型 class PoloBlog: _sum = 0.0 # 構造方法 def __init__(self, name): self._name = name # 保護方法 def _printName(self): print(self._name) # 類方法 @classmethod def _classMethod(cls): print(cls._sum) blog = PoloBlog("小菠蘿") # 打印保護類型的類屬性 print(PoloBlog._sum) # 打印保護類型的實例屬性 print(blog._name) # 實例對象調用保護類型的實例方法 blog._printName() # 實例對象調用保護類型的類方法 blog._classMethod() # 類對象調用保護類型的類方法 PoloBlog._classMethod() # 輸出結果 0.0 小菠蘿 小菠蘿 0.0 0.0
知識點
- 父類的 protect 屬性,子類可以繼承
- 實例對象、類對象都能直接調用 protect 屬性、方法
總的來說,和公共變量沒有什么特別大的區別
總結
無論是受保護型變量還是私有變量,其實在外部還是能訪問的,所以並不能真正控制屬性的訪問權限
