2010-04-10 18 views
129

Come posso ottenere le classi genitore di una classe Python?Ottieni genitore/i della classe?

+31

@FranckDernoncourt Questo thread è ora il risultato principale di Google per "python get genitore di classe". È leggermente più rilevante delle altre domande SO che compongono i prossimi 3 risultati. Il quinto risultato è una pagina di documenti Python che non dà la risposta, e il sesto risultato è infine una pagina di documenti Python che fornisce la risposta, anche se in profondità in una lunga pagina di testo. –

+22

Perché qualcuno dovrebbe leggere i documenti quando le spiegazioni su SO sono molto più convincenti e di facile accesso? Mi ci sono voluti meno di 5 secondi dal momento in cui mi è venuta questa domanda fino al momento in cui sono arrivato a questa pagina da Google, mentre la ricerca dei documenti mi avrebbe richiesto almeno cinque volte più a lungo e probabilmente un paio di minuti. – jononomo

+6

Come qualcuno che voleva trovare rapidamente questa risposta, ha cercato google, trovato questo link e fatto ciò che avevo bisogno di fare: perché le persone (presumo che il commento di SLott sia stato rimosso) si lagnano di una domanda valida che viene posta? E sì, mi rendo conto di essere estremamente in ritardo per la festa qui. – limasxgoesto0

risposta

149

Utilizzare il seguente attributo:

cls.__bases__ 

Dal docs:

La tupla di classi base di un oggetto classe.

Esempio:

>>> str.__bases__ 
(<type 'basestring'>,) 

Un altro esempio:

>>> class A(object): 
... pass 
... 
>>> class B(object): 
... pass 
... 
>>> class C(A, B): 
... pass 
... 
>>> C.__bases__ 
(<class '__main__.A'>, <class '__main__.B'>) 
74

Se si desidera che tutti i antenati piuttosto che solo quelle immediate, usa inspect.getmro:

import inspect 
print inspect.getmro(cls) 

In pratica, questo fornisce tutte le classi di antenati nell'ordine di risoluzione dei metodi, ovvero l'ordine in cui gli antenati saranno controllati quando risolvono un metodo (o, in realtà, qualsiasi altro attributo - i metodi e gli altri attributi vivono nello stesso namespace in Python, dopo tutto ;-).

+7

Puoi anche usare 'cls .__ mro__' (almeno in Python 3.5) – naught101

3

Se si desidera assicurarsi che vengano tutti chiamati, utilizzare super a tutti i livelli.

+0

Una volta che usi super devi comunque usarlo a tutti i livelli, motivo per cui dovresti documentarlo esplicitamente. Potresti anche voler sapere che super non funziona su ogni classe ... – DasIch

11

Le classi di nuovo stile dispongono di un metodo mro che è possibile chiamare e restituisce un elenco di classi padre nell'ordine di risoluzione dei metodi.

+0

Cosa conta come una classe di nuovo stile? Sembra che posso usarlo con i modelli Django, ma qualsiasi cosa che semplicemente erediti da 'object' non sembra rispondere a' mro'. –

+0

considerare un oggetto 'x', possiamo ottenere l'ordine di risoluzione metodo con la chiamata ' tipo (x) .mro() ' possiamo considerare se' 'x' ha ClassX' come classe base con: 'ClassX in type (x) .mro()' – 648trindade

Problemi correlati