使用带有`abc`库的抽象类时获取python类名

Pra*_*rni 6 python abc

我想在使用带有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用来解析和获取类名不感兴趣。

gmd*_*mds 7

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

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

你想要的是AB他们自己的名字,你可以分别用A.__name__B.__name__获得。

  • 您可以使用 A.__mro__[0] 来获取实际的类对象。 (2认同)