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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top