как извлечь класс, из которого исходит super () .__ init__? - PullRequest
0 голосов
/ 24 июня 2019

Представьте себе класс MyMixInClass, который используется в иерархии множественного наследования. При использовании super() для вызова какого-либо метода, существует ли какой-либо способ проверки или детализации для извлечения класса, из которого получен этот метод?

пример:

class MyMixInClass:
   def __init__(self):
      initfunc = getattr(super(), '__init__')
      # can we figure out which class the __init__ came from?

1 Ответ

0 голосов
/ 27 июня 2019

Для каждого класса в последовательности mro вы можете проверить, существует ли метод __init__ в классе __dict__:

class A:
    def __init__(self):
        pass

class B(A):
    def __init__(self):
        super().__init__()

class C(A):
    pass

class D(B, C):
    pass

if __name__ == '__main__':

    for cls in D.__mro__:
        if '__init__' in cls.__dict__:
            print(f'{cls.__name__} has its own init method', end='\n')
        else:
            print(f'{cls.__name__} has no init method', end='\n')

выход:

D has no init method
B has its own init method
C has no init method
A has its own init method
object has its own init method

В этом выводе первый класс, имеющий метод __init__ (здесь B), это тот, который вызывается super().__init__() в D()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...