在将抽象 classes 与 `abc` 库一起使用时获取 python class 名称

Fetching python class name while using abstract classes with `abc` library

我想在使用带有 abc 库的抽象 classes 时提取 python class 名称。不幸的是,我收到了 class 名称 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) 似乎打印了 class 名称,所以我假设可以从某处提取 class 名称。但是尽管如此,我对使用 str 解析和获取 class 名称不感兴趣。

仅使用 __name__ 属性

print(A.__name__)
#A

A 本身就是一个 class,如果你使用 A.__class__ 你会得到它的 metaclass 因此它是 metaclass 的名字。

回想一下,metaclass 是 class 的 类型,而 class 是其实例的类型。

如果我们有a = A()aA类型,Aabc.ABCMeta类型。因此,您自然应该期望 A.__class__B.__class__ 都是 return abc.ABCMeta,因为它们是它的实例!

你要的是AB本身的名字,你可以分别用A.__name__B.__name__得到。