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

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


当前回答

如果您希望为对象列表(或可迭代集合)解决此问题,以下是我的解决方法:

from operator import attrgetter

# Will use a few data types to show a point
my_list = [1, "2", 3.0, [4], object(), type, None]

# I specifically want to create a generator
my_class_names = list(map(attrgetter("__name__"), map(type, my_list))))

# Result:
['int', 'str', 'float', 'list', 'object', 'type', 'NoneType']


# Alternatively, use a lambda
my_class_names = list(map(lambda x: type(x).__name__, my_list))

其他回答

要获取实例类名:

type(instance).__name__

or

instance.__class__.__name__

两者都一样

如果您希望为对象列表(或可迭代集合)解决此问题,以下是我的解决方法:

from operator import attrgetter

# Will use a few data types to show a point
my_list = [1, "2", 3.0, [4], object(), type, None]

# I specifically want to create a generator
my_class_names = list(map(attrgetter("__name__"), map(type, my_list))))

# Result:
['int', 'str', 'float', 'list', 'object', 'type', 'NoneType']


# Alternatively, use a lambda
my_class_names = list(map(lambda x: type(x).__name__, my_list))

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

例子:

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

文档链接限定名

你尝试过类的__name__属性吗?即类型(x)__name__会给你班级的名字,我想这就是你想要的。

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

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

x.__class__.__name__

类型()?

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