2016-01-17 8 views
6

Sto utilizzando la classe csv.DictWriter, e voglio in possesso di questo:Python eredità tipo vecchio stile in una nuova classe di stile

class MyObj(csv.Dictwriter): 
    ... 

Ma questo tipo è un oggetto vecchio stile. Può MyObj essere una classe di nuovo stile ma ereditare ancora da csv.DictWriter?

+2

'classe MyObj (csv.DictWriter, oggetto)'? Vedi per es. http://stackoverflow.com/q/11527921/3001761 – jonrsharpe

risposta

3

Sì, avete solo per ereditare da object, troppo:

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

E quindi come apparirà la metrica _init__? – NI6

+0

@ NI6: come con qualsiasi classe normale, vedere la risposta. – Daniel

+2

Hm, questo è l'ordine opposto suggerito da https://stackoverflow.com/a/11528159/321973, poiché il tuo modo rende i metodi di 'object' prioritari quelli di' csv.Dictwriter'. E proprio il punto di usare una classe newstyle è _non_ chiamare esplicitamente metodi specifici di una classe genitrice, ma piuttosto essere in grado di usare 'super()', non è vero? –

2

Come Daniel correttamente states, è necessario mixin object. Tuttavia, un punto importante di utilizzare classi di nuovo stile è anche utilizzando super, quindi è necessario utilizzare

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

Come accennato elsewhere, object dovrebbe essere l'ultimo genitore, altrimenti object 's metodi predefiniti quali __str__ e __repr__ sarà scavalcare l'implementazione dell'altro genitore, che non è certamente quello che volevi ...

Problemi correlati