Data una classe Foo
(che si tratti di una nuova classe o meno), come si generano tutte le classi di base - ovunque nella gerarchia dell'ereditarietà - di che issubclass
?
Data una classe Foo
(che si tratti di una nuova classe o meno), come si generano tutte le classi di base - ovunque nella gerarchia dell'ereditarietà - di che issubclass
?
Risposte:
inspect.getmro(cls)
funziona sia per le classi nuove che per quelle precedenti e restituisce lo stesso di NewClass.mro()
: un elenco della classe e 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'>)
inspect.getmro(obj)
invece di inspect.getmro(type(obj))
.
Vedi la __bases__
proprietà disponibile su un pitone class
, 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>]
getmro
dice esplicitamente "Nessuna classe appare più di una volta in questa tupla"?
__bases__
sale solo di un livello . (Come implica la tua utilità ricorsiva, ma uno sguardo superficiale all'esempio potrebbe non riprenderlo.)
inspect.getclasstree()
creerà un elenco nidificato di classi e loro basi. Uso:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
puoi usare la __bases__
tupla dell'oggetto class:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
La tupla è tornata da __bases__
ha tutte le sue classi base.
Spero che sia d'aiuto!
__bases__
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.
Secondo il documento Python , possiamo anche semplicemente usare l' class.__mro__
attributo o il class.mro()
metodo:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
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 evidenziare che la gerarchia dell'ereditarietà di Python è la seguente:
ex:
class MyClass(YourClass):
Una classe ereditaria
ex:
class YourClass(Object):
Una classe ereditata
Una classe può ereditare da un'altra - Le classi 'attribuite sono ereditate - in particolare, i suoi metodi sono ereditati - questo 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.