個人Python學習筆記(三):私有變量

1、私有變量的定義

在Python中,有如下幾種方式來定義變量:spa

  • xx:公有變量
  • _xx:單前置下劃線,私有化屬性或方法,類對象和子類能夠訪問,from somemodule import *禁止導入
  • __xx:雙前置下劃線,私有化屬性或方法,沒法在外部直接訪問(名字重整因此訪問不到)
  • __xx__:雙先後下劃線,系統定義名字(不要本身發明這樣的名字)
  • xx_:單後置下劃線,用於避免與Python關鍵詞的衝突

 

如如下例子所示,我在test類中定義了num,_num 和 __num三個屬性,並建立了test的類對象t,對這三個屬性進行訪問,__num不能被訪問到.net

class test(object):
    def __init__(self):
        self.num = 10
        self._num = 20
        self.__num = 30

t = test()
print(t.num)    # 10
print(t._num)   # 20
# print(t.__num)  # AttributeError: 'test' object has no attribute '__num'

以下圖所示,使用命令dir查看t中的屬性和方法,__num的名字已經被重整爲「_test__num」了,可使用t._test__num對__num進行訪問對象

注:雖然私有變量能夠經過_類名__變量名來訪問,但強烈建議不要這樣作文檔

 

2、使用不一樣方法導入模塊,模塊中私有變量的使用區別

在使用不一樣方法導入模塊後,是否能使用模塊中的私有屬性和方法,有如下兩種狀況:get

  • 在使用 from somemodule import * 導入模塊的狀況下,不能導入或使用私有屬性和方法
  • 在使用 import somemodule 導入模塊的狀況下,能導入並使用私有屬性和方法

首先咱們先建立一個test.py文件,將下面代碼複製進去:it

num = 10
_num = 20
__num = 30

def test():
    print("--test--")

def _test2():
    print("--test2--")

def __test3():
    print("---test3--")
  • 使用 from somemodule import * 進行導入,不能導入私有變量,結果以下:

  • 使用 import somemodule 進行導入,能導入私有變量,結果以下:

 

3、對類中的私有屬性進行操做的方法

若是你想對類中的私有屬性進行操做時,有如下三種方法:class

  一、getter和setter

添加getter和setter方法,類對象經過調用這兩種方法來對私有屬性進行操做test

class test(object):
    def __init__(self):
        self.__num = 10
        
    def getNum(self):
        return self.__num

    def setNum(self, value):
        self.__num = value

t = test()
print(t.getNum())   # 10
t.setNum(20)
print(t.getNum())   # 20

  二、property方法

class test(object):
    def __init__(self):
        self.__num = 10

    def getNum(self):
        return self.__num
    
    def setNum(self, value):
        self.__num = value

    num = property(getNum,setNum)

t = test()
print(t.num)   # 10
t.num = 20
print(t.num)   # 20

關於property方法,咱們來看下官方文檔:import

由文檔可得:變量

  • property方法包含四個參數,分別爲fget,fset,fdel,doc,分別對應getter方法,setter方法,deleter方法和方法說明
  • property()方法返回一個property屬性,若是c是C的實例,那麼c.x會調用getter方法,c.x = value會調用setter方法,而del c.x會調用deleter方法

 

  三、@property

class test(object):
    def __init__(self):
        self.__num = 10

    @property
    def num(self):
        return self.__num

    @num.setter
    def num(self, value):
        self.__num = value

t = test()
print(t.num)   # 10
t.num = 20
print(t.num)   # 20

關於@property,官方文檔以下:

根據文檔可得:

  • 咱們能夠把property()方法當成一個裝飾器來使用,使用@property對方法進行裝飾
  • 裝飾器@property把方法x()轉換成了與方法名同名的getter方法,"I'm the 'x' property."是property的doc參數
  • 調用方法和property()方法同樣
相關文章
相關標籤/搜索