2016-01-17 16 views
6

Używam klasę csv.DictWriter, i chcę go odziedziczyć:Python dziedziczenie typu starym stylu w nowej klasie stylu

class MyObj(csv.Dictwriter): 
    ... 

Ale ten typ jest obiekt w starym stylu. Czy MyObj może być klasą w nowym stylu, ale nadal dziedziczy po csv.DictWriter?

+2

'class MyObj (csv.DictWriter, object)'? Zobacz np. http://stackoverflow.com/q/11527921/3001761 – jonrsharpe

Odpowiedz

3

Tak, tylko trzeba dziedziczą object też:

class MyObj(object, csv.DictWriter): 
    def __init__(self, f, *args, **kw): 
     csv.DictWriter.__init__(self, f, *args, **kw) 
+0

A jak wyglądać będzie ___itit__? – NI6

+0

@ NI6: jak w przypadku każdej normalnej klasy, patrz odpowiedź. – Daniel

+2

Hm, jest to odwrotna kolejność, którą sugeruje https://stackoverflow.com/a/11528159/321973, ponieważ twoja metoda sprawia, że ​​metody 'object' zastępują' csv.Dictwriter''s. I właśnie celem używania klasy newstyle jest _nie_ jawne wywoływanie określonych metod klasy macierzystej, ale raczej używanie 'super()', czyż nie? –

2

Daniel poprawnie states, trzeba mixin object. Jednak jednym ważnym punktem przy użyciu klas nowego stylu jest również za pomocą super, więc należy użyć

class MyObj(csv.DictWriter, object): 
    def __init__(self, csvfile, mycustomargs, *args, **kwargs): 
     super(MyOobj, self).__init__(csvfile, *args, **kwargs) 
     ... 

Jak wspomniano elsewhere, object powinien być ostatni rodzic, w przeciwnym razie object „s metody standardowe, takie jak __str__ i __repr__ będzie nadpisuję implementację drugiego rodzica, co z pewnością nie jest tym, czego chciałeś ...

Powiązane problemy