1、 應用場景及定義方式
①應用場景
在實際開發中,對象 的 某些屬性或方法 可能只希望 在對象的內部被使用,而 不希望在外部被訪問到
私有屬性 就是 對象 不希望公開的 屬性
私有方法 就是 對象 不希望公開的 方法
②定義方式
在 定義屬性或方法時,在 屬性名或者方法名前 增加 兩個下划線,定義的就是 私有 屬性或方法
class Women: def __init__(self, name): self.name = name # 不要問女人的年齡 self.__age = 18 def __secret(self): print("我的年齡是%d" % self.__age) a = Women('Alice') print(a) # # 私有屬性,外部不能直接訪問 # a.__age # 私有方法, 外部不能直接訪問 # a.__secret()
02. 偽私有屬性和私有方法(科普)
提示:在日常開發中,不要使用這種方式,訪問對象的 私有屬性 或 私有方法
Python
中,並沒有 真正意義 的 私有
在給 屬性、方法 命名時,實際是對 名稱 做了一些特殊處理,使得外界無法訪問到
處理方式:在 名稱 前面加上 _類名
=> _類名__名稱
print(a._Women__age) >> 18 # 私有屬性外部不能直接訪問 print(a._Women__secret()) >> 我的年齡是18 # 私有方法外部不能直接訪問
03.get函數和set函數
解決外部訪問私有屬性問題
get函數:獲取值
set函數:設置值【賦值,傳值】
說明:本質都是一個普通成員函數,get函數一般有返回值,set設置參數
class Women: def __init__(self, name): self.name = name # 不要問女人的年齡 self.__age = 18 def setAge(self): self.__age = 18 def getAge(self): return self.__age def __secret(self): print("我的年齡是%d" % self.__age) a = Women('Alice') print(a.getAge()) >> 18
@property裝飾器:將一個函數當做變量使用,簡化get和set函數
使用:@property裝飾器作用於一個函數,相當於get函數
與此同時會生成一個新的裝飾器@屬性名.setter,相當於set函數用於賦值
注意:@property裝飾器只能使用在類中的成員方法中,簡化代碼,同時保證對參數進行校驗
class Person: def __init__(self, name, age): self.__name = name self.__age = age # 注意:函數的命名方式,get函數, # 函數的命名並不是固定的,只要是一個合法的標識符即可, # 但是,一般情況下,使用變量名命名,方便區分 @property def name(self): return self.__name # 注意:函數命名方式:和@property作用的函數名保持一致, # 裝飾器的命名方式:@屬性名.setter # 相當於是set函數,設置參數,給私有化屬性進行賦值 @name.setter def name(self, name): self.__name = name @property def age(self): return self.__age @age.setter def age(self, age): if age < 0: age = 0 self.__age = age p1 = Person("jack", 15) print(p1.name) #>>jack p1.name = 'tom' print(p1.name) #>>tom