__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
), то создаем новый пустой список. Это гарантирует, что каждый экземпляр класса будет иметь свой собственный список.