Elencare tutte le classi di base in una gerarchia di una determinata classe?
-
05-07-2019 - |
Domanda
Data una classe Foo
(sia che si tratti di new-style class o no), come si generano all le classi base - ovunque nella gerarchia dell'ereditarietà - issubclass
di?
Soluzione
inspect.getmro (cls)
funziona sia per le classi nuove che per quelle precedenti e restituisce lo stesso NewClass.mro ()
: un elenco della classe e di tutte le sue classi antenate, nell'ordine utilizzato per la risoluzione del metodo.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
Altri suggerimenti
Guarda la __bases__
disponibile disponibile su una classe
di python, che contiene una tupla delle classi di basi:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
inspect.getclasstree ()
creerà un elenco nidificato di classi e relative basi.
Uso:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
puoi usare la tupla __bases__
dell'oggetto di classe:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
La tupla restituita da __bases__
ha tutte le sue classi base.
Spero che sia d'aiuto!
Sebbene la risposta di Jochen sia molto utile e corretta, poiché puoi ottenere la gerarchia di classi usando il metodo .getmro () del modulo inspect, è anche importante sottolineare che la gerarchia di eredità di Python è la seguente:
es:
class MyClass(YourClass):
Una classe ereditaria
- Classe figlio
- Classe derivata
- sottoclasse
es:
class YourClass(Object):
Una classe ereditata
- Classe padre
- Classe base
- superclasse
Una classe può ereditare da un'altra - Le classi 'attribuite sono ereditate - in particolare, i suoi metodi sono ereditati - ciò significa che le istanze di una classe ereditaria (figlio) possono accedere all'attributo della classe ereditata (genitore)
istanza - > classe - > quindi classi ereditate
utilizzando
import inspect
inspect.getmro(MyClass)
ti mostrerà la gerarchia, all'interno di Python.
In Python 3.7 non è necessario importare inspect, type.mro ti darà il risultato.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
attenzione che in Python 3.x ogni classe eredita dalla classe di oggetti base.