1. 主页 > 小妙招

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))    # 查看方法参数

特别推荐这两个组合拳:

  1. inspect.getmro()看类继承关系
  2. inspect.ismethod()判断是不是方法
  3. 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()方法。这种实战技巧,文档里可不会告诉你。


七、避坑指南:这些雷别踩

  1. 别在循环里疯狂调用dir()——性能杀手
  2. 别直接用__dict__修改属性——用setattr()更安全
  3. 别迷信IDE提示——有些动态生成的属性不显示
  4. 别用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光眼??。下次遇到陌生对象时,别急着问人,先给它做个全身检查吧!

本文由嘻道妙招独家原创,未经允许,严禁转载