訪問控制,私有屬性 方法

2021-09-11 08:00:38 字數 1515 閱讀 3571

私有屬性(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...