Python 获取对象信息的所有方法
在 Python 里,我们经常需要检查一个对象的类型、属性、方法,甚至它的源码。这对调试、学习和动态编程特别有用。今天我们就来聊聊获取对象信息的常见方法,按由浅入深的顺序来学习。
参考文章:Python 获取对象信息 | 简单一点学习 easyeasy.me
1. 用 type()
查看对象类型
最直接的方法就是 type()
,它会返回对象的类型。
x = 123
print(type(x)) # <class 'int'>y = "Hello"
print(type(y)) # <class 'str'>
适合快速判断变量属于什么类型。
2. 用 isinstance()
判断对象类型
isinstance()
用来判断对象是否属于某个类(或其子类)。
x = 3.14
print(isinstance(x, float)) # True
print(isinstance(x, int)) # False# 支持元组,一次判断多个类型
print(isinstance(x, (int, float))) # True
适合类型分支处理,比
type()
更灵活,因为它会考虑继承关系。
3. 用 dir()
查看对象所有属性和方法
dir()
会列出对象的所有属性和方法(包括继承的)。
print(dir("abc"))
输出(部分):
['__add__', '__class__', '__contains__', '__eq__', ...]
小技巧:
dir()
会返回魔法方法(__xxx__
)和普通方法混在一起,可配合filter()
或列表推导筛掉。
4. 用 hasattr()
、getattr()
、setattr()
动态操作属性
这三个函数能动态检查、获取、设置属性。
class Person:def __init__(self, name):self.name = namep = Person("Tom")print(hasattr(p, "name")) # True
print(getattr(p, "name")) # Tomsetattr(p, "age", 18)
print(p.age) # 18
适合写通用代码,比如 JSON ↔ 对象 转换。
5. 用 vars()
或 __dict__
查看对象的属性字典
vars()
会返回对象的 __dict__
属性(存放实例变量的字典)。
class Car:def __init__(self, brand, price):self.brand = brandself.price = pricec = Car("Tesla", 300000)
print(vars(c)) # {'brand': 'Tesla', 'price': 300000}
print(c.__dict__) # 同样的结果
注意:内置类型(如
list
)没有__dict__
,因为它们用__slots__
或 C 实现。
6. 用 callable()
判断对象是否可调用
可调用对象包括函数、类、实现了 __call__
方法的实例。
print(callable(len)) # True
print(callable("hello")) # False
7. 用 id()
获取对象的内存地址
id()
返回对象在内存中的唯一标识(CPython 中是地址)。
x = 100
print(id(x)) # 例如 140714563326192
8. 用 help()
获取对象的文档说明
help()
会进入交互式帮助,显示对象的功能和用法。
help(str)
help(str.upper)
在 IDE 或交互式终端特别有用,相当于 Python 自带文档查询。
9. 用 __class__
和 __bases__
查看类信息
class Animal: pass
class Dog(Animal): passd = Dog()
print(d.__class__) # <class '__main__.Dog'>
print(Dog.__bases__) # (<class '__main__.Animal'>,)
10. 用 inspect
模块获取更详细信息(进阶)
inspect
是 Python 官方的“对象解剖工具”,功能很全。
import inspectdef foo(a, b=1):"""这是 foo 函数的说明"""return a + bprint(inspect.getsource(foo)) # 获取源码
print(inspect.signature(foo)) # 获取函数签名
print(inspect.getdoc(foo)) # 获取文档字符串
print(inspect.getmodule(foo)) # 获取所在模块
常用函数:
inspect.getmembers(obj)
获取对象所有成员inspect.isfunction(obj)
判断是否是函数inspect.ismethod(obj)
判断是否是方法
11. 用 __slots__
限制并查看属性(特殊场景)
class Point:__slots__ = ("x", "y")def __init__(self, x, y):self.x = xself.y = yp = Point(1, 2)
# print(vars(p)) # 会报错,因为没有 __dict__
有些类用
__slots__
节省内存,这时vars()
取不到属性,需要自己访问。
12. 用 gc
模块查看所有对象(调试内存)
import gc
objs = gc.get_objects()
print(len(objs)) # 当前内存里对象的数量
13. 总结
在 Python 中,获取对象信息的方法从基础到进阶依次是:
type()
/isinstance()
dir()
/hasattr()
/getattr()
/setattr()
vars()
/__dict__
callable()
/id()
/help()
__class__
/__bases__
inspect
模块(源码、签名、文档)gc
模块(调试对象)
学会这些方法,你就能像外科医生一样“剖析”任何 Python 对象。