获取实例的类名

获取实例的类名

技术背景

在Python编程中,有时我们需要获取一个实例所属的类名,这在进行调试、日志记录或实现一些通用的工具函数时非常有用。Python提供了多种方法来实现这一目的,下面将详细介绍这些方法及其使用场景。

实现步骤

方法一:使用type(x).__name__

这种方法适用于Python 3以及Python 2中的新风格类(继承自object的类)。

1
2
3
import itertools
x = itertools.count(0)
print(type(x).__name__) # 输出: 'count'

方法二:使用x.__class__.__name__

该方法既适用于Python 3,也适用于Python 2中的新旧风格类。

1
2
3
4
class A:
pass
a = A()
print(a.__class__.__name__) # 输出: 'A'

方法三:使用类方法

可以在类中定义一个类方法来获取类名。

1
2
3
4
5
6
7
8
9
10
11
12
class A:
@classmethod
def get_classname(cls):
return cls.__name__

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

print(A.get_classname()) # 输出: 'A'
a = A()
print(a.get_classname()) # 输出: 'A'
print(a.use_classname()) # 输出: 'A'

方法四:获取限定名__qualname__

当处理嵌套类或方法时,__qualname__能提供更详细的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Spam:
def meth(self):
pass
class Bar:
pass

s = Spam()
print(type(s).__name__) # 输出: 'Spam'
print(type(s).__qualname__) # 输出: 'Spam'
print(type(s).Bar.__name__) # 输出: 'Bar'
print(type(s).Bar.__qualname__) # 输出: 'Spam.Bar'
print(type(s).meth.__name__) # 输出: 'meth'
print(type(s).meth.__qualname__) # 输出: 'Spam.meth'

处理对象列表

如果要获取一个对象列表中每个对象的类名,可以使用map函数结合attrgetterlambda表达式。

1
2
3
4
5
6
7
8
9
10
from operator import attrgetter

my_list = [1, "2", 3.0, [4], object(), type, None]
# 使用attrgetter
my_class_names = list(map(attrgetter("__name__"), map(type, my_list)))
print(my_class_names) # 输出: ['int', 'str', 'float', 'list', 'object', 'type', 'NoneType']

# 使用lambda
my_class_names = list(map(lambda x: type(x).__name__, my_list))
print(my_class_names) # 输出: ['int', 'str', 'float', 'list', 'object', 'type', 'NoneType']

核心代码

以下是获取实例类名的核心代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
# 获取单个实例的类名
class MyClass:
pass

obj = MyClass()
print(type(obj).__name__) # 输出: 'MyClass'
print(obj.__class__.__name__) # 输出: 'MyClass'

# 获取对象列表中每个对象的类名
my_objects = [1, "hello", [1, 2, 3]]
class_names = [type(obj).__name__ for obj in my_objects]
print(class_names) # 输出: ['int', 'str', 'list']

最佳实践

  • 对于Python 3及Python 2的新风格类,推荐使用type(x).__name__,代码简洁且易于理解。
  • 如果需要兼容Python 2的旧风格类,使用x.__class__.__name__
  • 当处理嵌套类或方法时,使用__qualname__可以获取更详细的类名信息。

常见问题

Python 2中type(instance).__name__instance.__class__.__name__的区别

在Python 2中,如果类是旧风格类(未继承自object),type(instance).__name__会返回'instance',而instance.__class__.__name__会返回实际的类名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 旧风格类
class OldClass():
pass

old_obj = OldClass()
print(type(old_obj).__name__) # 输出: 'instance'
print(old_obj.__class__.__name__) # 输出: 'OldClass'

# 新风格类
class NewClass(object):
pass

new_obj = NewClass()
print(type(new_obj).__name__) # 输出: 'NewClass'
print(new_obj.__class__.__name__) # 输出: 'NewClass'

获取实例的类名
https://119291.xyz/posts/getting-the-class-name-of-an-instance/
作者
ww
发布于
2025年5月23日
许可协议