2014-12-13 6 views
4
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 и вне класса, он отлично работает.

Ну, вы можете сказать мне, что я мог легко не обращать на это внимания, поскольку он работает вне класса. Но мне нужно это во время отладки.

Не могли бы вы прокомментировать, почему я не могу поймать значение в точке останова?

+1

Дважды подчеркивает взывать имя коверкая, вам нужно 'instance._Controller__whiteList' (или, лучше, использовать один символ подчеркивания и читать [руководство по стилю] (https://www.python.org/dev/peps/ PEP-0008 /)). – jonrsharpe

ответ

4

Когда вы префикс имени атрибута с двойным подчеркиванием, Python "mangles" the name, разместив перед ним _<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. Я бы убрал его. Обычно вы хотите избегать геттеров и сеттеров в Python с 99% времени, когда они ничего не делают, кроме помех определения класса.

+0

... и удалите ненужный метод getWhiteList. – Daniel

+0

Геттер может вернуть значение, но не позволяет вам его изменять - они все еще хороши в python. –

+0

@dgunchev - В этом случае вы можете сделать 'whiteList'' свойство @ и заставить его функцию 'setter' вызывать ошибку. Я говорю, что методы 'get_attribute' и' set_attribute' считаются уродливыми в Python. – iCodez

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 
Смежные вопросы