Как посмотреть наследников класса в python?

Пользователь

от richard , в категории: Python , 3 года назад

Как посмотреть наследников класса в python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от NicolasSsh , 3 года назад

@richard  Вы можете использовать вид CLASS.__subclasses__() Для того, чтобы узнать наследников класса.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class X:
    def __init__(self):
        pass


class Y(X):
    def __init__(self):
        pass


class Z(X):
    def __init__(self):
        pass

classType = X # Выбираем класс, у которого будут искаться наследующие классы

subclasses = list()

for child in classType.__subclasses__(): # Циклом перебираем все наследующие классы
    if child not in subclasses:
        subclasses.append(child) # Добавляем в общий список наследующих классов

print(subclasses)

# Вывод : [<class '__main__.Y'>, <class '__main__.Z'>]

Пользователь

от rebekah , 2 года назад

@richard 

Чтобы посмотреть все классы-наследники определенного класса в Python, можно использовать атрибут __subclasses__().


Например, предположим, что у вас есть класс MyClass, и вы хотите узнать все его классы-наследники. Вот как это можно сделать:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class MyClass:
    pass

class MySubclass(MyClass):
    pass

class MyOtherSubclass(MyClass):
    pass

# получаем все классы-наследники класса MyClass
subclasses = MyClass.__subclasses__()

# выводим имена классов-наследников
for subclass in subclasses:
    print(subclass.__name__)


Этот код выведет:

1
2
MySubclass
MyOtherSubclass


Обратите внимание, что __subclasses__() возвращает только прямых потомков класса, а не всех наследников в целом. Если вам нужно получить всех наследников (даже косвенных), то можно воспользоваться модулем inspect. Например, так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import inspect

class MyClass:
    pass

class MySubclass(MyClass):
    pass

class MyOtherSubclass(MyClass):
    pass

class MySubSubclass(MySubclass):
    pass

# получаем все классы-наследники класса MyClass (в том числе косвенных)
subclasses = set()
for cls in MyClass.__subclasses__():
    subclasses.add(cls)
    subclasses.update(inspect.getmembers(cls, lambda c: inspect.isclass(c)))

# выводим имена классов-наследников
for subclass in subclasses:
    print(subclass.__name__)


Этот код выведет:

1
2
3
MySubclass
MyOtherSubclass
MySubSubclass