私有屬性(private):用雙下劃線開頭的屬性名,就是私有屬性
class person:
def __init__(self,name,age=18):
self name = name
self.__age = age
def growup(self,i=1):
if i > 0 and i < 150:#控制邏輯
self.__age += i
p1=person('tom')
p1.growup(20)#正常的範圍
print(p1.__age)#可以嗎
通過實驗可以看出,外部已經訪問不到__age了,age根本就沒有定義,更是訪問不到。那麼,如何訪問這個私有變數__age呢?
使用方法來訪問
私有變數的本質:
類定義的時候,如果宣告乙個例項變數的時候,使用雙下劃線,python直譯器會將其改名,轉換名稱為_類名__變
量名的名稱,所以用原來的名字訪問不到了。
class person:
def __init__(self,name,age=18):
selfname=name
self.__age=age
def growup(self,i=1):
if i> 0 and i < 150:#控制邏輯
self.__age+=i
def getage(self):
return self.__age
p1=person('tom')
p1.growup(20)#正常的範圍
#print(p1.__age) #訪問不到
p1.__age=28
print(p1.__age)
print(p1.getage())
#為什麼年齡不一樣?__age沒有覆蓋嗎?
print(p1.__dict__)
#直接修改私有變數
p1._person__age=15
print(p1.getage())
print(p1.__dict__)
從上例可以看出,知道了私有變數的新名稱,就可以直接從外部訪問到,並可以修改它。
class person:
def __init__(self,name,age=18):
self name = name
self._age = age
tom=person('tom')
print(tom._age)
print(tom.__dict__)
可以看出,這個_age屬性根本就沒有改變名稱,和普通的屬性一樣,直譯器不做任何特殊處理。
這只是開發者共同的約定,看見這種變數,就如同私有變數,不要直接使用。
單下劃線的方法只是開發者之間的約定,直譯器不做任何改變。
雙下劃線的方法,是私有方法,直譯器會改名,改名策略和私有變數相同,_類名__方法名。
方法變數都在類的__dict__中可以找到
私有屬性 方法的訪問
在屬性 方法名前有雙下劃線的,稱為私有屬性 方法,私有屬性 方法外部不能直接訪問,一般訪問類的私有屬性,可以通過自身呼叫 使用了私有屬性的公有方法 間接訪問私有屬性 方法,但python中並沒有真正意義的私有,可以通過 類名 屬性 方法 來訪問。例 有乙個woman類,內有私有屬性 age 和 私有...
python的類訪問控制 私有屬性
一 訪問控制私有屬性 class person def init self,name,age 19 self.name name self.age age def growup self,i 1 if i 0 and i 150 self.age 1p1 person tom p1.growup 2...
類屬性類方法,私有屬性私有方法
類屬性類方法 類屬性 使用賦值語句在class關鍵字下定義 類方法 在類內部可以直接訪問雷屬性或者其它類方法 class student objict count 0 definit self,name self.name name student.count 1 classmethod def s...