调试期间的私有变量

Mic*_*ael 7 python attributes class

class Controller:

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

    def getWhiteList(self):
        return self.__whiteList
Run Code Online (Sandbox Code Playgroud)

好吧,我给了一个断点a = 0.

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

错误是:

AttributeError:'Controller' object has no attribute '__whiteList'
Run Code Online (Sandbox Code Playgroud)

嗯,这对我来说是一个谜.因为我有getter方法并且在课外,它完美地工作.

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

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

iCo*_*dez 5

当您使用双下划线为属性名称添加前缀时,Python会通过放置它来"破坏"该名称_<classname>.这意味着你需要这样做:

def getWhiteList(self):
    return self._Controller__whiteList
Run Code Online (Sandbox Code Playgroud)

为了访问该__whiteList属性.

但它看起来并不像你应该首先使用它__.您可能只想删除它并whiteList直接访问:

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

def getWhiteList(self):
    return self.whiteList
Run Code Online (Sandbox Code Playgroud)

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

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

def getWhiteList(self):
    return self._whiteList
Run Code Online (Sandbox Code Playgroud)

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

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