Зачем назначать поля класса за пределами конструктора - PullRequest
0 голосов
/ 16 апреля 2019

Я недавно видел код, который назначает список полю объекта после вызова конструктора.


# Inside the "Block" class definition
def __init__(self, name, access, address=None):
    ModuleBS.__init__(self, name, address)
    self.access = access
    self.mem_list = [] 



# Calling the constructor
tmp_blk = Block(block_name, name, access, sys_addr)
tmp_blk.mem_list = memory_list          ## assignment occurs after constructor invoked

Есть ли причина для этого?Почему это предпочтительнее, чем инициализация mem_list внутри конструктора, вместо этого, передавая memory_list в качестве аргумента конструктора?

Спасибо

1 Ответ

2 голосов
/ 16 апреля 2019

Перво-наперво, mem_list Инициализируется в классе '__init__:

# Inside the "Block" class definition
def __init__(self, name, access, address=None):
    ...
    self.mem_list = []

Позже вызов был просто изменением значения - некоторые просто использовали бы append() или insert(), некоторыепросто пропустил бы существующий список.

Что касается вашего второго вопроса, то вполне нормально сделать это в обе стороны - я в основном пишу свои классы таким образом, что могу инициализировать некоторую переменную с помощью вызова класса, с простой проверкойпосмотрите, являются ли переданные данные действительными, а затем измените эту переменную по требованию - если у моего метода init нет набора параметров.

В этом случае может быть просто проще инициализировать класс с помощьютолько необходимые поля (с некоторыми значениями по умолчанию для других), а затем просто измените эти значения напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...