获取实例的类名

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

我不确定我是否应该使用#0模块或解析__class__属性。

1346501 次浏览

#0

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

你试过类的#0属性吗?即type(x).__name__会给你类的名称,我认为这就是你想要的。

>>> import itertools>>> x = itertools.count(0)>>> type(x).__name__'count'

如果您仍在使用Python 2,请注意上述方法仅适用于新式课堂(在Python 3+中,所有类都是“新式”类)。您的代码可能使用一些旧式类。以下适用于两者:

x.__class__.__name__

您想要类的名称作为字符串吗?

instance.__class__.__name__

问得好。

以下是一个基于GHZ的简单示例,可能会对某人有所帮助:

>>> class person(object):def init(self,name):self.name=namedef info(self)print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__)>>> bob = person(name='Robert')>>> bob.info()My name is Robert, I am a person

在Python 2中,

type(instance).__name__ != instance.__class__.__name__# if class A is defined likeclass A():...
type(instance) == instance.__class__# if class A is defined likeclass A(object):...

示例:

>>> class aclass(object):...   pass...>>> a = aclass()>>> type(a)<class '__main__.aclass'>>>> a.__class__<class '__main__.aclass'>>>>>>> type(a).__name__'aclass'>>>>>> a.__class__.__name__'aclass'>>>

>>> class bclass():...   pass...>>> b = bclass()>>>>>> type(b)<type 'instance'>>>> b.__class__<class __main__.bclass at 0xb765047c>>>> type(b).__name__'instance'>>>>>> b.__class__.__name__'bclass'>>>
class A:pass
a = A()str(a.__class__)

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

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

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

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

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

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

class Spam:def meth(self):passclass 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'

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

或者,您可以使用classmethod装饰器:

class A:@classmethoddef 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(instance).__name__

instance.__class__.__name__

两者都是一样的

您可以简单地使用__qualname__,它代表函数或类的限定名称

示例:

>>> class C:...     class D:...         def meth(self):...             pass...>>> C.__qualname__'C'>>> C.D.__qualname__'C.D'>>> C.D.meth.__qualname__'C.D.meth'

留档链接qu al name

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

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

结果

foo