Pergunta

Dada uma Foo classe (se é um nova classe de estilo ou não), como você gerar todas as classes de base - em qualquer lugar na hierarquia de herança - que issubclass de?

Foi útil?

Solução

inspect.getmro(cls) funciona tanto para novos e antigos classes de estilo e retorna o mesmo que NewClass.mro():. uma lista de classe e todas as suas classes ancestrais, na ordem usado para resolução de método

>>> class A(object):
>>>     pass
>>>
>>> class B(A):
>>>     pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

Outras dicas

Veja a propriedade __bases__ disponível em um class python, que contém uma tupla das classes bases:

>>> 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() irá criar uma lista aninhada de classes e suas bases. Uso:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

Você pode usar o tuple __bases__ do objeto de classe:

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

A tupla retornada por __bases__ tem todas as suas classes de base.

Espero que ajude!

Embora a resposta de Jochen é muito útil e correto, como você pode obter a hierarquia de classe usando o método .getmro () do inspecionar módulo, também é importante destacar que a hierarquia de herança de Python é a seguinte:

ex:

class MyClass(YourClass):

Uma classe herdando

  • classe Child
  • classe derivada
  • subclasse

ex:

class YourClass(Object):

Uma classe herdada

  • classe Parent
  • Classe base
  • Superclasse

Uma classe pode herdar de outra - A classe atribuído são herdadas - em particular, os seus métodos são herdadas - Isso significa que instâncias de uma classe (filha) herdando pode acessar atribuídos do (pai) classe herdada

instância -> class -> aulas então herdadas

usando

import inspect
inspect.getmro(MyClass)

irá mostrar-lhe a hierarquia, dentro de Python.

Em Python 3.7 você não precisa importar inspecionar, type.mro lhe dará o resultado.

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

atenção que em python 3.x cada classe herda de classe de objeto base.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top