Python查看对象结构的方法及实例详解
??"这破代码又报'没有这个属性'!"?? 你是不是也经常对着屏幕抓狂?上个月我同事小王就因为看不懂对象结构,硬生生花2小时查一个本可以10分钟解决的问题。今天咱们就聊聊这个必杀技——看透Python对象的十八般武艺。
一、Python对象到底长啥样?
打个比方,Python对象就像快递包裹。外包装是它的类型,里头装着属性和方法这两个核心部件。比如说咱们常见的字符串"hello"
:
python复制print(type("hello")) # 输出:
这时候你可能会问:"那这个包裹里到底装了啥好东西?" 别急,咱们的dir()
望远镜马上安排上。
二、人手必备的dir望远镜
在Python控制台输入这个试试:
python复制print(dir("hello"))
唰的一下蹦出来几十个方法名对吧?这就是字符串对象的所有家当。??重点来了??:
- 带双下划线的是特殊方法(比如
__add__
) - 不带的是普通方法(比如
upper
) - 注意看有没有
_
开头的(比如_formatter
),这是人家藏起来的私房钱
上周我用这个方法帮实习生找到了隐藏的split
方法,那小伙子的表情就像发现新大陆似的。
三、照妖镜__dict__显原形
有些时候dir()看着太眼花?试试对象的__dict__
属性。这个就像给对象做X光检查:
python复制class Dog: def __init__(self,name): self.name = name my_dog = Dog("旺财") print(my_dog.__dict__) # 输出:{'name': '旺财'}
看见没?这个字典把实例的属性扒得明明白白。不过要注意:
- 这个方法只对类实例有效
- 类本身的属性得用
类名.__dict__
- 遇到@property装饰的属性可能会漏拍
四、专业级CT扫描仪inspect
当你要查看函数参数、类继承这些高级信息时,得请出标准库里的inspect
模块。上次我研究Flask源码时就靠它破案:
python复制import inspect from datetime import datetime print(inspect.getmembers(datetime.now())) # 输出200+项详细信息 print(inspect.signature(datetime.now)) # 查看方法参数
特别推荐这两个组合拳:
inspect.getmro()
看类继承关系inspect.ismethod()
判断是不是方法inspect.getsource()
偷看源码(慎用!)
五、IDE里的隐藏快捷键
你知道吗?在PyCharm里对着对象按Ctrl+鼠标左键
能直接跳转到定义。VSCode里输完.
之后自动弹方法列表。这些工具用好了,效率直接翻倍。
我统计过:
- 用命令行调试:平均每次查属性耗时3分钟
- 用IDE工具:20秒内搞定
- 但要注意:线上环境可没这些好东西
六、实战案例:Django模型大解剖
上周帮朋友看Django项目,有个模型总是报错:
python复制class User(models.Model): username = models.CharField(max_length=20) print(User.objects.filter(username='张三').__dict__)
这时候用__dict__
发现查询集里藏着_result_cache
属性,原来他漏写了.first()
方法。这种实战技巧,文档里可不会告诉你。
七、避坑指南:这些雷别踩
- 别在循环里疯狂调用
dir()
——性能杀手 - 别直接用
__dict__
修改属性——用setattr()
更安全 - 别迷信IDE提示——有些动态生成的属性不显示
- 别用
inspect
查内置类型——直接看文档更快
有次我手贱改了__dict__
里的值,结果程序崩得连亲妈都不认识,血泪教训啊!
八、冷门但好用的vars()
其实vars(obj)
就是obj.__dict__
的官方马甲,用起来更优雅:
python复制import requests r = requests.get('https://www.baidu.com') print(vars(r)) # 看到headers/cookies等关键信息
这个在调试网络请求时特别好使,能一眼看清服务器返回的数据结构。
最近用这些方法帮团队优化了日志分析模块,原来需要2小时定位的问题现在10分钟搞定。最后送大家一句话:??读代码不是查字典,会看对象结构的人,写出来的代码都带着X光眼??。下次遇到陌生对象时,别急着问人,先给它做个全身检查吧!
本文由嘻道妙招独家原创,未经允许,严禁转载