Вам необходимо переопределить __init__
, чтобы выполнить преобразование ввода, прежде чем передать его до list
__init__
, например. с пониманием списка или генератором выражения:
class myList(list):
def __init__(self, it=()):
super().__init__([x * 2 for x in it])
def __repr__(self):
return list.__repr__(self)
Версия выражения генератора будет super().__init__(x * 2 for x in it)
; он избегает потенциально большого временного list
, но обычно будет медленнее.
Примечание: вам вообще не нужно переопределять __repr__
; вы наследуете его от list
автоматически, так что вы можете просто опустить определение полностью. Переопределение имеет смысл, только если вы хотите отобразить в два раза, но сохранить исходные значения, в этом случае вы хотите:
class myList(list):
def __repr__(self):
return repr([x * 2 for x in self])
Редактировать : Поскольку операционная система запросила способ инициализации myList
, затем удвоив значения, вы можете немедленно вызвать инициализатор list
, а затем выполнить дублирование на myList
впоследствии. myList
все еще не полностью инициализируется до тех пор, пока не вернется __init__
, и будет медленнее, но это отделяет базовую инициализацию list
от удвоения:
class myList(list):
def __init__(self, it=()):
super().__init__(it) # Perform list initialization with original values
# Cycle through values and double each one
for i, x in enumerate(self):
self[i] = x * 2