2016-12-28 1 views
0

Это из первого питона главы книги (стр. 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) 
+0

Вы видели 'def __init __ (self, a_times = [])' в книге? Если это так, вам стоит подумать об изменении книги. http://stackoverflow.com/documentation/python/3553/common-pitfalls/12258/mutable-default-argument#t=201612281429272429582 – DeepSpace

+1

Как я вижу, 'AthleteList' имеет тип' list' и, следовательно, '[]' вместо «self» используется для инициализации родительского объекта (какой конструктор не нуждается в каких-либо аргументах). Но в моих глазах это очень, очень нечисто. Попробуйте 'list .__ init __ ([1, 2, 3])' в вашем первом фрагменте кода и создайте объект с помощью emtpy 'a_times'. Значения не будут показаны. – ppasler

+0

Наследование из списка проще с помощью ['UserList'] (https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.UserList). здесь все работает как искупитель. –

ответ

1

это, вероятно, самый безопасный способ подкласс list; использовать UserList в качестве базового класса, и все работает, как ожидалось:

from collections import UserList 

class AthleteList(UserList): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

athlete_list = AthleteList((1, 2, 3)) 
print(athlete_list) # -> [1, 2, 3] 

, что по общему признанию, не ответит на все ваши вопросы, но может быть отправной точкой.

вот более подробный ответ об этом: https://stackoverflow.com/a/25464724/4954037.

Смежные вопросы