Атрибут атрибута атрибута атрибута вне __init__
Я разделил свой конструктор классов, разрешив ему вызвать несколько функций, например:
class Wizard:
def __init__(self, argv):
self.parse_arguments(argv)
self.wave_wand() # declaration omitted
def parse_arguments(self, argv):
if self.has_correct_argument_count(argv):
self.name = argv[0]
self.magic_ability = argv[1]
else:
raise InvalidArgumentsException() # declaration omitted
# ... irrelevant functions omitted
Пока мой переводчик с радостью запускает мой код, у Пилинта есть жалоба:
Instance attribute attribute_name defined outside __init__
Беглый поиск Google в настоящее время бесплоден. Сохранение всей логики конструктора в __init__
кажется неорганизованным, и выключение предупреждения Pylint также кажется взломанным.
Что такое / Pythonic способ решить эту проблему?
Ответы
Ответ 1
Идея этого сообщения заключается в удобочитаемости. Мы ожидаем найти все атрибуты, которые может иметь экземпляр, прочитав его метод __init__
.
Однако вы все же можете разделить инициализацию на другие методы. В этом случае вы можете просто назначить атрибуты None
(с небольшим количеством документации) в __init__
, а затем вызвать методы супериализации.
Ответ 2
Просто верните кортеж из parse_arguments()
и распакуйте в атрибуты внутри __init__
по мере необходимости.
Кроме того, я бы рекомендовал использовать Исключения вместо exit(1)
. Вы получаете трассировку, ваш код можно использовать повторно и т.д.
class Wizard:
def __init__(self, argv):
self.name,self.magic_ability = self.parse_arguments(argv)
def parse_arguments(self, argv):
assert len(argv) == 2
return argv[0],argv[1]