預設情況下,屬性在python 中都是「public」。
1:雙下劃線(__)
python
為類元素(屬性和方法)的私有性提供初步的形式。由雙下劃線開始的屬性在執行時被「混淆」,所以直接訪問是不允許的。實際上,會在名字前面加上下劃線和類名。
class pubpri(object):
def__init__(self, num):
self._num= num
self.__num = num
self.__num__= num
self.pubnum= num
>>> n1 = pubpri(3)
>>> n1._num
3>>> n1.__num__
3>>> n1.pubnum 3
>>>n1.__num
traceback(most recent call last):
file"", line 1, in
attributeerror:'pubpri' object has no attribute '__num'
>>>n1._pubpri__num
3
儘管這樣做提供了某種層次上的私有化,但演算法處於公共域中,並且很容易被破解。
這種名字混淆的另乙個目的,是為了保護__*** 變數不與父類名字空間相衝突。如果在類中有乙個__*** 屬性,它將不會被其子類中的__*** 屬性覆蓋。使用__***,子類的**就可以安全地使用__***,而不必擔心它會影響到父類中的__***。
2:單下劃線(_)
在乙個模組中以單下劃
線開頭的變數和函式被預設當作內部函式,如果使用from a_moduleimport * 匯入時,這部分變數和函式不會被匯入。
不過值得注意的是,如果使用 import a_module 這樣匯入模組,仍然可以用a_module._some_var 這樣的形式訪問到這樣的物件。比如,假設test.py內容如下:
import sys
_modulenum = 3
__modulenum = 3
__modulenum__ = 3
pubnum = 3
def _fun():
print 'this is',sys._getframe().f_code.co_name
def __fun():
print'this is ', sys._getframe().f_code.co_name
def __fun__():
print'this is ', sys._getframe().f_code.co_name
def fun():
print'this is ', sys._getframe().f_code.co_name
>>> from test import *
>>>_modulenum
...nameerror: name'_modulenum' is not defined
>>>__modulenum
...nameerror: name'__modulenum' is not defined
>>>__modulenum__
...nameerror: name'__modulenum__' is not defined
>>>pubnum 3
>>> _fun()
...nameerror: name'_fun' is not defined
>>> __fun()
...nameerror: name'__fun' is not defined
>>>__fun__()
...nameerror: name'__fun__' is not defined
>>> fun()
this is fun
>>> import test
>>>test._modulenum
3>>>test.__modulenum
3>>>test.__modulenum__
3>>>test.pubnum
3>>>test._fun()
this is _fun
>>>test.__fun()
this is __fun
>>>test.__fun__()
this is __fun__
>>>test.fun()
this is fun
雙下劃線開頭雙下劃線結尾的是一些 python 的特殊物件,如類成員的 __init__、__del__、__add__、__getitem__等。python
官方推薦永遠不要將這樣的命名方式應用於自己的變數或函式,而是按照文件說明來使用。
注意,私有化都是針對外部而言,在類內部,依然可以使用正常的訪問方式,在類的外部就必須進行「混淆」了。比如:
class test(object):
__cversion =1.1
def__init__(self):
self.__iversion= 1.2
deffun(self):
printself.__iversion
printtest.__cversion
printself._test__iversion
printself._test__cversion
>>> from test import test
>>> t1 = test()
>>> t1.fun()
1.21.11.2
1.1>>> t1.__iversion
traceback (most recent call last):
file"", line 1, in
attributeerror: 'test' object has no attribute'__iversion'
>>> t1._test__iversion
1.2>>> t1.__cversion
traceback (most recent call last):
file"", line 1, in
attributeerror: 'test' object has no attribute'__cversion'
>>> t1._test__cversion
1.1
參考:
python基礎 私有化
私有化 私有化 封裝 1.私有化屬性 2.定義公有set和get方法 屬性就是私有化,訪問範圍僅僅限於類中 私有化的優勢是 1.隱藏屬性不被外界隨意修改 2.想修改時利用set 函式來改 3.可以利用if來篩選賦值內容 4.如果想獲取某乙個具體的屬性,可以利用get函式 class student ...
python私有化方法 Python 私有化
python中的私有變數和私有方法仍然是可以訪問的 訪問方法如下 私有變數 例項.類名 變數名 私有方法 例項.類名 方法名 python並沒有真正的私有化支援,但可用下劃線得到偽私有。盡量避免定義以下劃線開頭的變數 1 單下劃線 開始的成員變數叫做保護變數,意思是只有類例項和子類例項能訪問到這些變...
python 私有化屬性
python 沒有和其他程式語言一樣的定義共有屬性和私有屬性的關鍵字,實現屬性私有化和屬性保護,都是使用 格式進行的偽效果。私有化使用場景 保護屬性 比如銀行存款等,存款直接外放非常危險,就可以私有化,然後通過類提供的方法增加刪減鉛筆的金額,對存款進行保護。內部過濾 過濾一下不符合屬性的資料,資料不...