Извлечение имени класса Python при использовании абстрактных классов с библиотекой `abc` - PullRequest
0 голосов
/ 27 мая 2019

Я хочу извлечь имя класса python при использовании абстрактных классов с библиотекой abc.К сожалению, вместо этого я получаю имя класса ABCMeta.


import abc

class A(abc.ABC)
    pass

class B(A)
    pass

print(A.__class__.__name__)  # output: 'ABCMeta'
print(B.__class__.__name__)  # output: 'ABCMeta'
print(str(A))  # output: "<class '__main__.A'>"
print(str(B))  # output: "<class '__main__.B'>"

Я ожидаю, что должен получить вывод, как показано ниже

print(A.__class__.__name__)  # output: 'A'
print(B.__class__.__name__)  # output: 'B'

Кажется, что str(A) и str(B) выводят на печатьимя класса, поэтому я предполагаю, что имя класса может быть извлечено откуда-то.Но, тем не менее, мне не интересно использовать str для анализа и получения имени класса.

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Напомним, что метакласс является типом класса , а класс является типом его экземпляров.

Если у нас есть a = A(), a имеет тип A, а A имеет тип abc.ABCMeta. Поэтому естественно ожидать, что A.__class__ и B.__class__ оба возвращают abc.ABCMeta, поскольку они являются его экземплярами!

Вам нужны только имена A и B, которые вы можете получить с помощью A.__name__ и B.__name__ соответственно.

1 голос
/ 27 мая 2019

Используйте только свойство __name__

print(A.__name__)
#A

A сам по себе является классом, если вы используете A.__class__, вы получаете его метакласс, следовательно, его имя метакласса.

...