Python 中如何获取一个实例的类名?
获取实例类名的两种方式:type(obj).__name__ 或 obj.__class__.__name__,两者等价。如需完整限定名用 __qualname__ 或 __module__ + __name__。
两种等价写法:type(obj).__name__ 或 obj.__class__.__name__,都返回类名字符串(如 'MyClass')。
基本用法
class MyClass:
pass
obj = MyClass()
print(type(obj).__name__) # MyClass
print(obj.__class__.__name__) # MyClass
需要更多信息时
print(type(obj).__qualname__) # 嵌套类/方法内类的限定名,如 'Outer.Inner'
print(type(obj).__module__) # 类所在模块,如 'myapp.models'
print(f"{type(obj).__module__}.{type(obj).__qualname__}") # 完整路径
典型用途:日志和序列化
在日志里自动记录类名,比手写字符串更不易出错:
import logging
logger = logging.getLogger(type(self).__name__)
这是 Python 项目里给每个类配独立 logger 的惯用法。
常见问题(FAQ)
Q:type(obj) 和 obj.class 有区别吗?
A:对普通对象结果一样。type() 是更常见的写法;__class__ 可以被对象覆写(如某些代理对象),所以严格来说 type() 更可靠。
Q:想要类本身而不是名字?
A:直接用 type(obj) 或 obj.__class__,返回的是类对象,可以继续实例化:type(obj)()。
Q:内置类型也能用吗?
A:能,type([]).__name__ 得到 'list',type('').__name__ 得到 'str'。