我想在将abc
库与抽象类一起使用时提取python类名称。不幸的是,我却得到了类名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
进行解析并获取类名并不感兴趣。
答案 0 :(得分:3)
回想一下,元类是类的类型,而类是其实例的类型。
如果我们有a = A()
,则a
的类型为A
,而A
的类型为abc.ABCMeta
。因此,您自然应该期望A.__class__
和B.__class__
都返回abc.ABCMeta
,因为它们是实例!
您想要的是A
和B
本身的名称,分别可以通过A.__name__
和B.__name__
获得。
答案 1 :(得分:1)
仅使用__name__
属性
print(A.__name__)
#A
A
本身就是一个类,如果您使用A.__class__
,则会得到它的元类,因此它是元类的名称。