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

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


当前回答

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(instance).__name__

or

instance.__class__.__name__

两者都一样

或者,您可以使用classmethoddecorator:

class A:
    @classmethod
    def get_classname(cls):
        return cls.__name__

    def use_classname(self):
        return self.get_classname()

用法:

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'

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

class foo:pass;

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

后果

foo

除了获取特殊的__name__属性之外,您可能会发现自己需要给定类/函数的限定名称。这是通过获取__qualiname__类型来完成的。

在大多数情况下,它们将完全相同,但在处理嵌套类/方法时,它们在输出方面有所不同。例如:

class Spam:
    def meth(self):
        pass
    class Bar:
        pass

>>> s = Spam()
>>> type(s).__name__ 
'Spam'
>>> type(s).__qualname__
'Spam'
>>> type(s).Bar.__name__       # type not needed here
'Bar'
>>> type(s).Bar.__qualname__   # type not needed here 
'Spam.Bar'
>>> type(s).meth.__name__
'meth'
>>> type(s).meth.__qualname__
'Spam.meth'

因为内省是你追求的,所以这是你可能需要考虑的。

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中进行了测试。