当前位置: 首页 > news >正文

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 中,获取对象信息的方法从基础到进阶依次是:

  1. type() / isinstance()
  2. dir() / hasattr() / getattr() / setattr()
  3. vars() / __dict__
  4. callable() / id() / help()
  5. __class__ / __bases__
  6. inspect 模块(源码、签名、文档)
  7. gc 模块(调试对象)

学会这些方法,你就能像外科医生一样“剖析”任何 Python 对象。

http://www.lryc.cn/news/616240.html

相关文章:

  • matlab实现随机森林算法
  • Doubletrouble靶机练习
  • 点击速度测试:一款放大操作差距的互动挑战游戏
  • #Datawhale AI夏令营#第三期全球AI攻防挑战赛(AIGC技术-图像方向)
  • 如何用分析方法解决工作中的问题?
  • 检索召回率优化探究五(BGE-M3 混合检索):基于LangChain0.3 集成Milvu2.5 向量数据库构建的智能问答系统
  • Linux系统编程Day11 -- 进程属性和常见进程
  • 学习模板元编程(3)enable_if
  • 【树状数组】Dynamic Range Sum Queries
  • [激光原理与应用-221]:设计 - 皮秒紫外激光器 - 常见技术难题、原因与解决方案
  • Linux-静态配置ip地址
  • 【无标题】命名管道(Named Pipe)是一种在操作系统中用于**进程间通信(IPC)** 的机制
  • 深度解析Linux设备树(DTS):设计原理、实现框架与实例分析
  • 基于Qt/QML 5.14和YOLOv8的工业异常检测Demo:冲压点智能识别
  • 线程池的核心线程数与最大线程数怎么设置
  • 基于FFmpeg的B站视频下载处理
  • 简要介绍交叉编译工具arm-none-eabi、arm-linux-gnueabi与arm-linux-gnueabihf
  • 【iOS】JSONModel源码学习
  • 2025.8.10总结
  • mpv core_thread pipeline
  • 第16届蓝桥杯Scratch选拔赛初级及中级(STEMA)2025年4月13日真题
  • ARM保留的标准中断处理程序入口和外设中断处理程序入口介绍
  • Python设计模式 - 装饰模式
  • 双亲委派机制是什么?
  • 亚麻云之轻云直上EC2
  • 硬件开发_基于STM32单片机的智能电梯系统
  • 关键基础设施中的新兴技术如何扩大网络风险
  • Java .class文件反编译成 .java文件
  • LeetCode 括号生成
  • 机器学习数学基础:46.Mann-Kendall 序贯检验(Sequential MK Test)