Это из первого питона главы книги (стр. 208, глава 6). Сначала я видел пример в книге инициализации подкласса, как так:Инициализирующий список суперкласса - сам параметр, необходимый иногда, но не другим?
class AthleteList(list):
def __init__(self, a_times=[]):
list.__init__([])
self.extend(a_times)
Когда я пришел писать свою собственную версию, я думал, что я мог бы пропустить extend
шаг:
class AthleteList(list):
def __init__(self, a_times=[]):
list.__init__(a_times)
Когда его приходит к печати списка:
test = AthleteList([1,2,3])
print(test)
выход []
, так что есть что-то не так с инициализацией. When searching around, во всяком случае, я обнаружил, что я видел, что это необходимо для инициализации суперкласса, явно передавая self
:
class AthleteList(list):
def __init__(self, a_times=[]):
list.__init__(self, a_times)
Который имеет смысл: список суперкласса необходим объект сам передается в качестве аргумента, так что он может инициализируются свой список значения. Кроме того, почему в первом примере не было self
(что действительно работает)? Даже если я инициализирую его пустым списком, мне все равно нужно передать объект self
, чтобы список self
был пустым. Я даже не нужно инициализировать его в пустой список первых, это, кажется, делает это по умолчанию, и я могу просто продлить позже:
class AthleteList(list):
def __init__(self, a_times=[]):
self.extend(a_times)
Вы видели 'def __init __ (self, a_times = [])' в книге? Если это так, вам стоит подумать об изменении книги. http://stackoverflow.com/documentation/python/3553/common-pitfalls/12258/mutable-default-argument#t=201612281429272429582 – DeepSpace
Как я вижу, 'AthleteList' имеет тип' list' и, следовательно, '[]' вместо «self» используется для инициализации родительского объекта (какой конструктор не нуждается в каких-либо аргументах). Но в моих глазах это очень, очень нечисто. Попробуйте 'list .__ init __ ([1, 2, 3])' в вашем первом фрагменте кода и создайте объект с помощью emtpy 'a_times'. Значения не будут показаны. – ppasler
Наследование из списка проще с помощью ['UserList'] (https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.UserList). здесь все работает как искупитель. –