Какая разница в объявлении атрибутов в конструкторе следующими 3 способами? - PullRequest
0 голосов
/ 04 декабря 2018
def __init__(self):
    self.score=[]

def __init__(self,score=[]):
    self.score=score

def __init__(self,score):
    self.score=[]

Не могли бы вы объяснить, что происходит за кулисами?ТИА.

Ответы [ 5 ]

0 голосов
/ 04 декабря 2018

Первый и последний методы имеют одинаковый эффект: назначьте пустой список атрибуту экземпляра score.По какой-то странной причине третий требует дополнительного позиционного параметра score, который не используется.

Средний создает и резервирует значение по умолчанию для параметра score;во время анализа это значение является пустым списком.Любой экземпляр, который пропускает этот аргумент, получает зарезервированный список.Опасность заключается в том, что все эти экземпляры будут ссылаться на один и тот же список : изменение атрибута score в одном будет отражено в всех других объектов, которые использовали значение по умолчаниюзначение.

0 голосов
/ 04 декабря 2018

score в заголовке функции является локальной переменной

def init(self,score):

и здесь это атрибут экземпляра

self.score=[]
0 голосов
/ 04 декабря 2018
def init(self):
    self.score=[]

self.score всегда инициализируется пустым списком.

def init(self,score=[]):
    self.score=score

Вызывающий может передать необязательный параметр списка.Если они этого не делают, self.score инициализируется в пустой список один раз, когда функция определена.(См. Common Gotchas: изменяемые аргументы по умолчанию , почему это плохая идея.)

def init(self,score):
    self.score=[]

Вызывающий должен передать параметр списка (обычно, который будет назначен на self.score, но вы выбрасываете это значение и устанавливаете self.score в пустой список).Третий пример, вероятно, должен быть:

def init(self, score):
    self.score = score
0 голосов
/ 04 декабря 2018

В первом вы всегда присваиваете [] переменной оценки объекта.Во втором случае вы можете построить объект с или без значения оценки, например, если вы сделаете obj = object ([1,2,3]), тогда у него будет оценка, равная [1,2,3],но вы также можете вызвать его без аргумента Score, например obj = object (), и он будет иметь значение, равное [].В третьем примере вы должны создать с аргументом Score, но он будет проигнорирован, так как он не присвоен переменной self.score.

0 голосов
/ 04 декабря 2018
  1. Элемент «Score» всегда установлен на []
  2. У вас есть возможность указать, что вы хотите установить для «Score» участника.
  3. Вам необходимоуказать «оценка» при строительстве объекта.Отличие от 2. в том, что здесь у вас есть для его указания, а в 2. это необязательно, и вы просто устанавливаете значение по умолчанию
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...