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方法,所以在课堂之外它完美无缺。
好吧,你可以告诉我,我可以很容易地注意到它,因为它在课外工作。但是在调试过程中我需要它。
你能评论为什么我不能在断点处抓住这个值吗?
答案 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