das Verhalten einer Liste im Bezug auf + modifizieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Hi, ich möchte eine Klasse von list erben lassen
und ihr verhalten so modifizieren, dass immer wenn
ein item angefügt oder entfernt wird, registriert wird,
welche teile der liste gleich geblieben sind/sich geändert haben.

bei append, extend, pop, insert, __setitem__, __getitem__ , ...
geht das ja auch ohne probleme, aber wie kann man das verhalten der liste
im bezug auf ( somelist += [item1, item2 ... ] ) verändern ?

wird durch einen operator auch eine methode der instance aufgerufen ?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Steht alles in der Doku.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

steht zwar nicht in der doku, aber die doku hat insofern schon geholfen, dass sie
vergleichs-operatoren anspricht.
hab die function gefunden, die bei + aufgerufen wird.
allerdings verhält sie sich ein wenig seltsam,
( oder mach ich irgendwas falsch ? :shock:

Code: Alles auswählen

In [1]: class TestList(list):
   ...:     def __iadd__(self, some_list):
   ...:         print('kk')
   ...:         list.__iadd__(self, some_list)
   ...: 

In [2]: tl = TestList([1,2,3,4])

In [3]: tl
Out[3]: [1, 2, 3, 4]

In [4]: tl += [5, 6, 7]
kk

In [5]: tl

In [6]: type(tl)
Out[6]: <type 'NoneType'>

In [7]: class Tlist(list):
   ...:     def __iadd__(self, some_list):
   ...:         print type(some_list)
   ...:

In [9]: tl = Tlist()

In [10]: tl += [1,2,3,4]
<type 'list'>

In [14]: class Tlist(list):
   ....:     def __iadd__(self, *args, **kwargs):
   ....:         print(args)                     
   ....:         print(kwargs)                   
   ....:         list.__iadd__(self, *args, **kwargs)
   ....: 

In [15]: tl = Tlist([1,2,3,4])

In [16]: tl
Out[16]: [1, 2, 3, 4]

In [17]: tl += [5, 6, 7, 8]
([5, 6, 7, 8],)            
{}
Hat da jemand ne ahnung was ich falsch mache ?

edit:
habs rausgefunden, list.__iadd__ (self, some_list) wird an irgendeine andere funktion weitergegeben, und muss deswegen zurückgegeben werden :)
thx for the help nuss
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du musst natürlich ein Ergebnis zurückgeben.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

vielleicht hilft [wiki]Tutorial/von list erben[/wiki]weiter ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten