У меня есть класс под названием state_class
:
class state_class:
def __init__(self, state_name):
self.state_name = state_name
@property
def state_col(self):
"""state_col getter"""
return self._state_col
@state_col.setter
def state_col(self):
"""state_col setter"""
self._state_col = state_col
Я запускаю этот класс внутри оператора if
и цикла for
:
for region in regions:
if region == '1':
for region in regions:
for col in range(prelim_sheet.ncols):
if (prelim_sheet.cell_value(0, col) == r.region_name):
...
else:
for state in state_list:
if state.strip() == 'NewHampshire':
s = state_class(state)
if ((prelim_sheet.cell_value(0, col)).replace(" ", "") == s.state_name):
s.state_col = col
print(s.state_col)
...
Как видите, внизу у меня есть оператор печати для s.state_col
, который выводит правильное значение. Но если я попытаюсь вызвать s.state_col
вне циклов if
и for
, я получу ошибку:
AttributeError Traceback (последний последний вызов) в ----> 1 s.state_col
AttributeError: объект «state_class» не имеет атрибута «state_col»
Я проверил это вне циклов, и он отлично работает:
s = state_class('NewHampshire')
col = 20
s.state_col = col
print(s.state)
>>> 20
Есть ли причина, по которой он устанавливает state_col
внутри цикла или позволяет мне вызывать его снаружи? Как я могу решить эту проблему?
self._state_col
не существует, что полностью согласуется с концепцией программирования с отслеживанием состояния. Возможно, это плохой выбор дизайна: вы должны либо обрабатывать исключение, либо избегать такого программирования с отслеживанием состояния. Кстати, все атрибуты должны быть объявлены при инициализации объекта. Вы всегда можете назначитьNone
(или любое другое пустое значение) для сброса переменных и обработать эту ситуацию в геттере. - person Eli Korvigo   schedule 14.11.2019classes
, и я не уверен, что вы имеете в виду, говоря о вызове геттера перед сеттером. Вы можете проиллюстрировать? - person gwydion93   schedule 14.11.2019