З огляду на клас Foo
(чи це клас нового стилю чи ні), як ви генеруєте всі базові класи - в будь-якій точці ієрархії спадкування - це issubclass
?
З огляду на клас Foo
(чи це клас нового стилю чи ні), як ви генеруєте всі базові класи - в будь-якій точці ієрархії спадкування - це issubclass
?
Відповіді:
inspect.getmro(cls)
працює як для нових, так і для старих класів стилів і повертає те саме, що NewClass.mro()
: список класу та всі його класи предків у порядку, що використовується для вирішення методу.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
замість inspect.getmro(type(obj))
.
Перегляньте __bases__
властивість, доступну на пітоні class
, який містить кортеж базових класів:
>>> 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
прямо написано "Жоден клас не відображається більше ніж один раз у цьому кортежі"?
__bases__
піднімається лише на один рівень . (Як випливає з вашої рекурсивної утиліти, але побіжний погляд на приклад може не сприймати цього.)
inspect.getclasstree()
створить вкладений список класів та їх бази. Використання:
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)))'
ви можете використовувати __bases__
кортеж об’єкта класу:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Кортеж, що повертається, __bases__
має всі його базові класи.
Сподіваюся, це допомагає!
__bases__
У python 3.7 вам не потрібно імпортувати перевірку, type.mro дасть результат.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
увагу, що в python 3.x кожен клас успадковує від базового класу об'єктів.
Згідно з документом Python , ми також можемо просто використовувати class.__mro__
атрибут або class.mro()
метод:
>>> 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
Хоча відповідь Йохана дуже корисна і правильна, оскільки ви можете отримати ієрархію класів за допомогою методу .getmro () модуля перевірки, також важливо підкреслити, що ієрархія спадкування Python полягає в наступному:
колишній:
class MyClass(YourClass):
Клас успадкування
колишній:
class YourClass(Object):
Спадковий клас
Один клас може успадковувати інший - атрибутові класу передаються у спадок - зокрема, його методи успадковуються - це означає, що екземпляри спадкового (дочірнього) класу можуть отримати доступ до атрибутованого спадкового (батьківського) класу
екземпляр -> клас -> потім успадковані класи
використовуючи
import inspect
inspect.getmro(MyClass)
покаже вам ієрархію в Python.