在将抽象类与abc库一起使用时获取python类名

时间:2019-05-27 05:19:23

标签: python abc

我想在将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进行解析并获取类名并不感兴趣。

2 个答案:

答案 0 :(得分:3)

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

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

您想要的是AB本身的名称,分别可以通过A.__name__B.__name__获得。

答案 1 :(得分:1)

仅使用__name__属性

print(A.__name__)
#A

A本身就是一个类,如果您使用A.__class__,则会得到它的元类,因此它是元类的名称。