Ответ 1
Поскольку кортежи неизменяемы, вместо этого вы должны переопределить __new__
:
object.__new__(cls[, ...])
Вызывается для создания нового экземпляра class
cls
.__new__()
является статическим метод (специальный корпус, поэтому вам не нужно объявите его как таковой), который принимает класс которого экземпляр был в качестве первого аргумента. остальными аргументами являются те, которые прошли к выражению конструктора объекта (вызов класса). Возврат значение__new__()
должно быть новым экземпляр объекта (обычно это экземпляр ofcls
).Типичные реализации создают новый экземпляр класса, вызвав метод суперкласса
__new__()
, используяsuper(currentclass, cls).__new__(cls[, ...])
с соответствующими аргументами и затем изменение вновь созданного если необходимо, перед возвратом он.Если
__new__()
возвращает экземплярcls
, то новые экземпляры__init__()
будет вызываться как__init__(self[, ...])
, где self - это новый экземпляр, а остальные аргументы те же, что и переданные до__new__()
.Если
__new__()
не возвращает экземплярcls
, то новый instance__init__()
метод не будет вызывается.
__new__()
предназначен главным образом для обеспечения подклассов неизменяемых типов (например,int
,str
илиtuple
) для настройки создание экземпляра. Это также обычно переопределяется в пользовательских метаклассах в чтобы настроить создание класса.