談?wù)凱ython:為什么類中的私有屬性可以在外部賦值并訪問
Python:為什么類中的私有屬性可以在外部賦值并訪問?
問題引入
在慕課網(wǎng)上學(xué)習(xí)Python**類中的私有屬性**的時候,看到了一個同學(xué)的提問:
將count改為__count,為什么實(shí)例變量在外部仍然可以修改__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
問題解決:
單刀直入版:
這是因?yàn)榻op1.__count賦值的操作,其實(shí)是在p1中定義了一個名為__count的變量(因?yàn)镻ython中的都是動態(tài)變量),而沒有改變類中真正的屬性。
太長但還是要看看版:
知識點(diǎn)清單:
1、類的“偽私有屬性”
2、在類的外部動態(tài)地創(chuàng)建類屬性
問題解決過程:
1、“偽私有屬性”的概念:
python的類中通過加雙下劃線來設(shè)置的“私有屬性”其實(shí)是“偽私有屬性”,原理是python編譯器將加了雙下劃線的“屬性名”自動轉(zhuǎn)換成“類名屬性名”。所以我們在外部用“屬性名”訪問私有屬性的時候,會觸發(fā)AttributeError,從而實(shí)現(xiàn)“私有屬性”的特性。但通過“類名屬性名”也可以訪問這些屬性。
參考:http://www.pythonclub.org/python-class/private
2、編寫測試代碼:
以下是在該同學(xué)的代碼的基礎(chǔ)上修改的測試代碼:
class Person(object):
#設(shè)置類屬性
__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')
#初始化實(shí)例p1
p1 = Person('Bob')
#在實(shí)例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)
分別在實(shí)例p1上和類Person上進(jìn)行操作,并且分別打印出“__屬性名”,以及“_類名__屬性名”。
輸出結(jié)果如下:
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給它賦值了,但其實(shí)在類中真正的屬性_Person__count_of_class的原始值是沒有改變的。
但是如果將p1._Person__count_of_class賦值,那么類屬性定義的原始值就真正地被覆蓋了**
""" 取消掉 ##Person._Person__count_of_class = 'I\'m not the original count_of_class!' 的注釋,輸出結(jié)果: """ 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,這是為什么?
這是因?yàn)榻op1.__count_of_class賦值的操作,其實(shí)是在p1中定義了一個名為__count_of_class的變量(因?yàn)镻ython中的都是動態(tài)變量)。
以下實(shí)例說明可以通過外部賦值來為類創(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!' #在類中新加的屬性,可以通過實(shí)例來訪問 print(p1.new_of_class) >>>輸出: I'm new in p1! I'm new in Person!
問題解決。
以上這篇談?wù)凱ython:為什么類中的私有屬性可以在外部賦值并訪問就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析
- 如何安裝并使用conda指令管理python環(huán)境
- python執(zhí)行CMD指令,并獲取返回的方法
- Python3之外部文件調(diào)用Django程序操作model等文件實(shí)現(xiàn)方式
- Python如何調(diào)用外部系統(tǒng)命令
- 詳解python函數(shù)的閉包問題(內(nèi)部函數(shù)與外部函數(shù)詳述)
- python 函數(shù)內(nèi)部修改外部變量的方法
- python3 打開外部程序及關(guān)閉的示例
- python執(zhí)行外部程序的常用方法小結(jié)
- Python常用外部指令執(zhí)行代碼實(shí)例
相關(guān)文章
python實(shí)現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能
這篇文章主要介紹了python實(shí)現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
從零學(xué)python系列之從文件讀取和保存數(shù)據(jù)
在Python一般都是運(yùn)用內(nèi)置函數(shù)open()與文件進(jìn)行交互,下面說說具體用法2014-05-05
Python如何解決secure_filename對中文不支持問題
最近使用到了secure_filename,然后悲劇的發(fā)現(xiàn)中文居然不展示出來,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-07-07
Vscode?遠(yuǎn)程切換Python虛擬環(huán)境的詳細(xì)步驟
使用VSCode遠(yuǎn)程切換Python虛擬環(huán)境涉及安裝VSCode和必要擴(kuò)展、連接遠(yuǎn)程服務(wù)器、創(chuàng)建或激活虛擬環(huán)境,并選擇對應(yīng)Python解釋器,詳細(xì)步驟包括安裝Python和Remote-SSH擴(kuò)展,感興趣的朋友一起看看吧2024-09-09
python實(shí)現(xiàn)的一個火車票轉(zhuǎn)讓信息采集器
這篇文章主要介紹了python實(shí)現(xiàn)的一個火車票轉(zhuǎn)讓信息采集器,采集信息來源是58同程或者趕集網(wǎng),需要的朋友可以參考下2014-07-07
解決Python 中JSONDecodeError: Expecting value:&n
這篇文章主要介紹了解決Python 中JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯誤問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運(yùn)算式
這篇文章主要介紹了Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運(yùn)算式,然后介紹了另外一個相關(guān)實(shí)例,具體內(nèi)容請參閱正文,需要的朋友可以參考下。2017-11-11

