談談Python:為什么類中的私有屬性可以在外部賦值并訪問
Python:為什么類中的私有屬性可以在外部賦值并訪問?
問題引入
在慕課網(wǎng)上學習Python**類中的私有屬性**的時候,看到了一個同學的提問:
將count改為__count,為什么實例變量在外部仍然可以修改__count?這里print p1.__count可以打印出100
class Person(object):
__count = 0
def __init__(self, name):
Person.__count = Person.__count + 1
self.name = name
print Person.__count
p1 = Person('Bob')
p1.__count=100
print p1.__count
p2 = Person('Alice')
print Person.__count
問題解決:
單刀直入版:
這是因為給p1.__count賦值的操作,其實是在p1中定義了一個名為__count的變量(因為Python中的都是動態(tài)變量),而沒有改變類中真正的屬性。
太長但還是要看看版:
知識點清單:
1、類的“偽私有屬性”
2、在類的外部動態(tài)地創(chuàng)建類屬性
問題解決過程:
1、“偽私有屬性”的概念:
python的類中通過加雙下劃線來設置的“私有屬性”其實是“偽私有屬性”,原理是python編譯器將加了雙下劃線的“屬性名”自動轉換成“類名屬性名”。所以我們在外部用“屬性名”訪問私有屬性的時候,會觸發(fā)AttributeError,從而實現(xiàn)“私有屬性”的特性。但通過“類名屬性名”也可以訪問這些屬性。
參考:http://www.pythonclub.org/python-class/private
2、編寫測試代碼:
以下是在該同學的代碼的基礎上修改的測試代碼:
class Person(object):
#設置類屬性
__count_of_class = 'original count_of_class'
def __init__(self, name):
self.name = name
print('in class Person : count_of_class = ', Person.__count_of_class,'\n')
#初始化實例p1
p1 = Person('Bob')
#在實例p1上修改屬性值
p1.__count_of_class='I\'m not the original count_of_class!'
print('p1\'s _Person__count_of_class = ',p1._Person__count_of_class)
print('p1\'s __count_of_class = ',p1.__count_of_class,'\n')
#在類Person上修改屬性值
Person.__count_of_class = 'I\'m not the original count_of_class!'
#將這句注釋取消掉,會發(fā)現(xiàn)真正的私有屬性的值也改變了
#Person._Person__count_of_class = 'I\'m not the original count_of_class!'
print('Person\'s _Person__count_of_class = ',Person._Person__count_of_class)
print('Person\'s __count_of_class = ',Person.__count_of_class)
分別在實例p1上和類Person上進行操作,并且分別打印出“__屬性名”,以及“_類名__屬性名”。
輸出結果如下:
in class Person : count_of_class = original count_of_class p1's _Person__count_of_class = original count_of_class p1's __count_of_class = I'm not the original count_of_class! Person's _Person__count_of_class = original count_of_class Person's __count_of_class = I'm not the original count_of_class!
**由此可見,雖然用p1.__count_of_class給它賦值了,但其實在類中真正的屬性_Person__count_of_class的原始值是沒有改變的。
但是如果將p1._Person__count_of_class賦值,那么類屬性定義的原始值就真正地被覆蓋了**
""" 取消掉 ##Person._Person__count_of_class = 'I\'m not the original count_of_class!' 的注釋,輸出結果: """ in class Person : count_of_class = original count_of_class p1's _Person__count_of_class = original count_of_class p1's __count_of_class = I'm not the original count_of_class! #注意這一句: Person's _Person__count_of_class = I'm not the original count_of_class! Person's __count_of_class = I'm not the original count_of_class!
由此,我們知道了:_count_of_class和_Person_count_of_class不是同一個東西。
最后的問題
但是呢,如果不先給p1.__count_of_class賦值,直接打印它又會觸發(fā)AttributeError,這是為什么?
這是因為給p1.__count_of_class賦值的操作,其實是在p1中定義了一個名為__count_of_class的變量(因為Python中的都是動態(tài)變量)。
以下實例說明可以通過外部賦值來為類創(chuàng)造屬性:
class Person(object): pass p1=Person() #給p1創(chuàng)建屬性new_of_instance p1.new_of_instance = 'I\'m new in p1!' print(p1.new_of_instance) #給Person類創(chuàng)建屬性new_of_class Person.new_of_class = 'I\'m new in Person!' #在類中新加的屬性,可以通過實例來訪問 print(p1.new_of_class) >>>輸出: I'm new in p1! I'm new in Person!
問題解決。
以上這篇談談Python:為什么類中的私有屬性可以在外部賦值并訪問就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python實現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能
這篇文章主要介紹了python實現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
從零學python系列之從文件讀取和保存數(shù)據(jù)
在Python一般都是運用內置函數(shù)open()與文件進行交互,下面說說具體用法2014-05-05
Python如何解決secure_filename對中文不支持問題
最近使用到了secure_filename,然后悲劇的發(fā)現(xiàn)中文居然不展示出來,本文就詳細的介紹一下解決方法,感興趣的可以了解一下2021-07-07
Vscode?遠程切換Python虛擬環(huán)境的詳細步驟
使用VSCode遠程切換Python虛擬環(huán)境涉及安裝VSCode和必要擴展、連接遠程服務器、創(chuàng)建或激活虛擬環(huán)境,并選擇對應Python解釋器,詳細步驟包括安裝Python和Remote-SSH擴展,感興趣的朋友一起看看吧2024-09-09
解決Python 中JSONDecodeError: Expecting value:&n
這篇文章主要介紹了解決Python 中JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯誤問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Python算法輸出1-9數(shù)組形成的結果為100的所有運算式
這篇文章主要介紹了Python算法輸出1-9數(shù)組形成的結果為100的所有運算式,然后介紹了另外一個相關實例,具體內容請參閱正文,需要的朋友可以參考下。2017-11-11

