Как задать значение атрибута по умолчанию в конструкторе?

Можно задать значение атрибута по умолчанию непосредственно в сигнатуре метода __init__:
class MyClass:
  def __init__(self, attribute1, attribute2="default_value"):
    self.attribute1 = attribute1
    self.attribute2 = attribute2

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

Пример:


 class MyClass:
  def __init__(self, attribute1, attribute2="default_value"):
  self.attribute1 = attribute1
  self.attribute2 = attribute2

 # Создание экземпляра класса с использованием значения по умолчанию для attribute2
 obj1 = MyClass("value1")
 print(obj1.attribute1) # Вывод: value1
 print(obj1.attribute2) # Вывод: default_value

 # Создание экземпляра класса с заданием значения для attribute2
 obj2 = MyClass("value2", "custom_value")
 print(obj2.attribute1) # Вывод: value2
 print(obj2.attribute2) # Вывод: custom_value
  

Объяснение:

  • Конструктор __init__ принимает два аргумента: attribute1 и attribute2.
  • attribute2="default_value" означает, что если при создании объекта не передать значение для attribute2, то ему будет присвоено значение "default_value".
  • attribute1 не имеет значения по умолчанию, поэтому его необходимо указывать при создании экземпляра класса.

Важно:

  • Аргументы со значениями по умолчанию должны располагаться в конце списка аргументов функции/метода. То есть, нельзя сначала указать аргумент без значения по умолчанию, а потом аргумент со значением по умолчанию.
  • Значения по умолчанию вычисляются один раз, когда определяется функция (в данном случае, __init__). Это может привести к неожиданному поведению при использовании изменяемых типов данных (например, списков или словарей) в качестве значений по умолчанию.

Пример проблемы с изменяемыми значениями по умолчанию:


 class MyClass:
  def __init__(self, my_list=[]):  # ОСТОРОЖНО! Изменяемый тип данных в качестве значения по умолчанию
  self.my_list = my_list
  self.my_list.append(1)

 obj1 = MyClass()
 print(obj1.my_list) # Вывод: [1]

 obj2 = MyClass()
 print(obj2.my_list) # Вывод: [1, 1]  <-- Неожиданно!

 obj3 = MyClass([2, 3])
 print(obj3.my_list) # Вывод: [2, 3, 1]

  

Решение проблемы с изменяемыми значениями по умолчанию:


 class MyClass:
  def __init__(self, my_list=None):
  if my_list is None:
  my_list = []
  self.my_list = my_list
  self.my_list.append(1)

 obj1 = MyClass()
 print(obj1.my_list) # Вывод: [1]

 obj2 = MyClass()
 print(obj2.my_list) # Вывод: [1]  <-- Теперь работает, как ожидалось!
  

В этом случае мы проверяем, передано ли значение для my_list. Если нет (т.е. my_list is None), то создаем новый пустой список. Это гарантирует, что каждый экземпляр класса будет иметь свой собственный список.

0