Python基礎 15私有化

2021-07-03 02:52:16 字數 3648 閱讀 3493

預設情況下,屬性在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 沒有和其他程式語言一樣的定義共有屬性和私有屬性的關鍵字,實現屬性私有化和屬性保護,都是使用 格式進行的偽效果。私有化使用場景 保護屬性 比如銀行存款等,存款直接外放非常危險,就可以私有化,然後通過類提供的方法增加刪減鉛筆的金額,對存款進行保護。內部過濾 過濾一下不符合屬性的資料,資料不...