如何查找用于在Python中创建对象实例的类的名称?

我不确定应该使用inspect模块还是解析__class__属性。


当前回答

是否要将类的名称作为字符串?

instance.__class__.__name__

其他回答

类型()?

>>> class A:
...     def whoami(self):
...         print(type(self).__name__)
...
>>>
>>> class B(A):
...     pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>

是否要将类的名称作为字符串?

instance.__class__.__name__
class A:
  pass

a = A()
str(a.__class__)

上面的示例代码(在交互式解释器中输入时)将生成'__main__.A',而不是调用__name__属性时生成的'A'。只需将A.__class__的结果传递给str构造函数,即可为您处理解析。但是,如果需要更明确的内容,也可以使用以下代码。

"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

如果在单独的模块中定义了具有相同名称的类,则此行为更可取。

上面提供的示例代码在Python 2.7.5中进行了测试。

您可以首先使用type,然后使用str从中提取类名。

class foo:pass;

bar:foo=foo();
print(str(type(bar))[8:-2][len(str(type(bar).__module__))+1:]);

后果

foo

要获取实例类名:

type(instance).__name__

or

instance.__class__.__name__

两者都一样