2013-01-23 11 views
6

Co jest nie tak z tym kodem?Python wbudowane typy podklasy

class MyList(list): 
    def __init__(self, li): self = li 

Kiedy tworzę instancję MyList z, na przykład, MyList([1, 2, 3]), a następnie wydrukować ten przykład, wszystkie uzyskać jest pusta lista []. Jeśli MyDict jest podklasy list, to nie jest MyDict sam MyDict sam ?

NB: oba w Pythonie 2.x i 3.x.

Odpowiedz

15

Trzeba zadzwonić do listy inicjator:

class MyList(list): 
    def __init__(self, li): 
     super(MyList, self).__init__(li) 

przypisanie self w funkcji tylko zastępuje zmienną lokalną z listy, nic do instancji nie przypisywać:

>>> class MyList(list): 
...  def __init__(self, li): 
...   super(MyList, self).__init__(li) 
... 
>>> ml = MyList([1, 2, 3]) 
>>> ml 
[1, 2, 3] 
>>> len(ml) 
3 
>>> type(ml) 
<class '__main__.MyList'> 
+0

Czy 'list .__ init __ (self)' również działa, gdy dziedziczy z 'list'? – Wolf

+0

@Wolf: tak, ale to wyklucza wielokrotne dziedziczenie, np. używanie tej klasy jako bazy razem z inną klasą. 'list' może nie być następną klasą w MRO w takich przypadkach. –

+0

Dzięki za wskazanie tego! Krótka odpowiedź, którą już tu znalazłem: [* Subclassing Built-in Types *] (http://www.cafepy.com/article/python_attributes_and_methods/ch03s02.html). * MRO * Mam nadzieję, że poprawnie podjąłem decyzję * Order Resolution Order *. – Wolf

0

wyobraziłem to na własną rękę: self jest instancją podklasy list, więc nie można jej rzucić na listę będącą wciąż obiektem MyList.

+2

Nie, 'self' jest odniesieniem do instancji' MyList'. Python nie ma funkcji rzutowania. Zobacz odpowiedź Martijna Pietera. – chepner

+0

@chepner Chociaż pod względem technicznym jest to prawda, jest bardzo powszechne nawet dla ludzi, którzy rozumieją zasadnicze znaczenie tego, jak nazwy odwołują się/wskazują obiekty, a efekty dla typów zmiennych i nieumiejętnych wyrażają taką relację jako "x _jest a_ listą trzech liczb całkowitych "nawet x zostało przypisane jako' a = 7 – cfwschmidt

Powiązane problemy