快速查看Python类结构:内置函数+第三方工具详解
刚学Python那会儿,我盯着同事写的类代码直发懵——这玩意儿到底藏了多少方法?就像新手如何快速涨粉一样,搞不懂类结构真是急死人。昨天还有个实习生问我:"哥,这个Django模型类里除了save()还有啥方法能用?" 今天咱们就唠透这件事。
一、自带神器dir()怎么用才不翻车?
先看这个电商平台的订单类:
python复制class Order: status = "pending" def __init__(self, price): self.price = price def calculate_tax(self): return self.price * 0.1 def _internal_check(self): pass
打开Python终端敲这行:
python复制print(dir(Order(100)))
唰一下出来几十个带双下划线的方法名,新手肯定当场傻眼。??重点来了??:用列表推导式过滤噪音
python复制# 过滤魔术方法和私有方法 methods = [m for m in dir(Order) if not m.startswith('__') and not m.startswith('_')] print(methods) # 输出:['calculate_tax', 'status']
你可能会有疑问:dir()函数真的靠谱吗?这里有个坑要注意——它不会显示被@property装饰的伪方法。比如把status改成属性装饰器:
python复制@property def status(self): return self._status
这时候dir()就抓瞎了,得用其他招数。
二、help()函数才是文档小能手
假设你在用第三方库的User类:
python复制from some_library import User print(help(User))
输出内容能把你吓一跳——哗啦啦出来七八屏文档。??实用技巧??:在命令行里用管道过滤
bash复制python -c "from some_library import User; help(User)" | grep -A5 "Methods"
但遇到没写文档的类咋办?上周我就踩过这个雷:
python复制class BadDocumentedClass: def important_method(self): # 这里没写注释... pass
这时候help()就成摆设了,得用下面的狠招。
三、第三方工具大比拼
这里推荐两个神器:??inspect模块??和??PyCharm的Structure窗口??。先看inspect怎么用:
python复制import inspect # 查类里的所有方法 methods = inspect.getmembers(Order, predicate=inspect.isfunction) print([m[0] for m in methods]) # 输出:['__init__', 'calculate_tax', '_internal_check'] # 看方法参数细节 init_method = inspect.signature(Order.__init__) print(init_method) # 输出:(self, price)
但命令行操作太麻烦?PyCharm用户直接按Alt+7(Windows)或Cmd+7(Mac),类结构立马展现在眼前。这功能对读Django这种大型框架的源码特别管用,比如看Model类的继承关系时,比肉眼快十倍。
工具对比表:
场景 | dir() | help() | inspect | PyCharm |
---|---|---|---|---|
查看私有方法 | ?? | ? | ?? | ?? |
显示方法参数 | ? | ?? | ?? | ?? |
不需要写代码 | ?? | ?? | ? | ?? |
能查看父类方法 | ? | ?? | ?? | ?? |
四、常见问题答疑
??Q:为啥我用了dir()却看不到刚写的新方法???
A:八成是忘了实例化对象!直接对类用dir()会漏掉实例属性,记住要dir(MyClass())而不是dir(MyClass)
??Q:查看numpy数组的方法有什么不同???
A:这类用C扩展写的对象比较特殊,得用np.info()或者查官方文档,常规方法可能不灵
??Q:查看类结构时卡死怎么办???
A:有些类会动态生成方法(比如SQLAlchemy),这时候别硬刚,直接去查ORM的文档更靠谱
我现在带新人都会先说:先用dir()扫个大概,复杂类上help(),读开源代码必用IDE的结构视图。就像学做菜先认调料再学刀工,别一上来就想玩满汉全席。特别是调试的时候,别傻乎乎地打印整个类结构——昨天看见实习生把200多个方法的类结构打印出来,电脑风扇都转起飞了...
本文由嘻道妙招独家原创,未经允许,严禁转载