我想在使用带有abc库的抽象类时提取 python 类名。不幸的是,我收到了 class name 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'>"
Run Code Online (Sandbox Code Playgroud)
我希望我应该收到如下输出
print(A.__class__.__name__)  # output: 'A'
print(B.__class__.__name__)  # output: 'B'
Run Code Online (Sandbox Code Playgroud)
在str(A)和str(B)似乎让我假设类的名字可以从什么地方提取打印的类名。但尽管如此,我对str用来解析和获取类名不感兴趣。
回想一下,元类是类的类型,而类是其实例的类型。
如果我们有a = A(),a是 类型A, 并且A是 类型abc.ABCMeta。因此,您自然应该期待A.__class__和B.__class__都返回abc.ABCMeta,因为它们是它的实例!
你想要的是A和B他们自己的名字,你可以分别用A.__name__和B.__name__获得。