调试期间的私有变量

时间:2014-12-13 21:44:35

标签: python class attributes

class Controller:

    def __init__(self):
        self.__whiteList = self.readFile('whiteList.txt')
        a = 0 # Breakpoint

    def getWhiteList(self):
        return self.__whiteList

好吧,我在a = 0放置了一个断点。

当我在断点处停下来时,我想评估__whiteList

错误是:

AttributeError:'Controller' object has no attribute '__whiteList'

嗯,这对我来说是一个谜。因为我有getter方法,所以在课堂之外它完美无缺。

好吧,你可以告诉我,我可以很容易地注意到它,因为它在课外工作。但是在调试过程中我需要它。

你能评论为什么我不能在断点处抓住这个值吗?

2 个答案:

答案 0 :(得分:5)

当您使用双下划线为属性名称添加前缀时,在_<classname>之前放置def getWhiteList(self): return self._Controller__whiteList 。这意味着你需要这样做:

__whiteList

以访问__属性。

但是看起来你应该首先使用whiteList。您可能只想删除它并直接访问def __init__(self): self.whiteList = self.readFile('whiteList.txt') a = 0 # Breakpoint def getWhiteList(self): return self.whiteList

def __init__(self):
    self._whiteList = self.readFile('whiteList.txt')
    a = 0 # Breakpoint

def getWhiteList(self):
    return self._whiteList

或者,您可以使用单个下划线:

_whiteList

这会发出一条明确的消息,即getWhiteList属性是内部属性,在正常情况下不应直接从课外访问。

此外,如果您决定使用其中任何一种方法,那么您的whiteList方法实际上没有用处,因为您可以直接访问{{1}}属性。我会删除它。您通常希望避免使用Python中的getter和setter,因为99%的时间它们什么也不做,只会使类定义混乱。

答案 1 :(得分:0)

您可以使用print self.getWhiteList()print self._Controller__whiteList

-> a = 0 # Breakpoint
(Pdb) list
  1     class Controller:
  2  
  3         def __init__(self):
  4             self.__whiteList = self.readFile('whiteList.txt')
  5 B->         a = 0 # Breakpoint
  6  
  7         def getWhiteList(self):
  8             return self.__whiteList
  9  
 10         def readFile(self, x):
 11             return x
(Pdb) print self
<__main__.Controller instance at 0x106d200>
(Pdb) print self.getWhiteList()
whiteList.txt
(Pdb) print self._Controller__whiteList
whiteList.txt