Как получить имена дочерних классов в унаследованном? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть базовый класс, который я наследую при создании других классов.

Одна из вещей, которые я хотел бы сделать, во время __init__(), - зарегистрировать родительский класс, из которого создается экземпляр объекта.Сегодня я делаю это явным образом:

class Main:
    def __init__(self, src):
        print(f"hello from {src}")

class One(Main):
    def __init__(self):
        super().__init__("one")

class Two(Main):
    def __init__(self):
        super().__init__("two")

One()
Two()

Это выводит

hello from one
hello from two

Есть ли способ для Main узнать, какой класс в конечном итоге создал объект?

Я думаю о чем-то вроде (это просто дико взмах руки, чтобы показать то, что я хотел бы назвать голым __init__ вместо передачи описательного параметра в видев коде выше)

class Main:
    def __init__(self, src):
        wherefrom = something_which_holds_the_class_hierarchy[1].__name__ # index 1 = one class above this one
        print(f"hello from {wherefrom}")

class One(Main):
    def __init__(self):
        super().__init__()

class Two(Main):
    def __init__(self):
        super().__init__()

One()
Two()

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

использовать функцию inspect.getmro

import inspect
inspect.getmro(Two)
0 голосов
/ 10 мая 2018

Для этого не нужно возиться с MRO s, просто посмотрите на type(self):

class Main:
    def __init__(self):
        print(f"Hello from {type(self).__name__}!")

class Sub(Main):
    pass

class SubSub(Sub):
    pass

Main()
Sub()
SubSub()

Результат:

Hello from Main!
Hello from Sub!
Hello from SubSub!

self.__class__ эквивалентно type(self), вы можете использовать любой из них.

0 голосов
/ 10 мая 2018
print(f"hello from {self.__class__}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...