1. 主页 > 小妙招

快速查看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()inspectPyCharm
查看私有方法???????
显示方法参数???????
不需要写代码???????
能查看父类方法???????

四、常见问题答疑

??Q:为啥我用了dir()却看不到刚写的新方法???
A:八成是忘了实例化对象!直接对类用dir()会漏掉实例属性,记住要dir(MyClass())而不是dir(MyClass)

??Q:查看numpy数组的方法有什么不同???
A:这类用C扩展写的对象比较特殊,得用np.info()或者查官方文档,常规方法可能不灵

??Q:查看类结构时卡死怎么办???
A:有些类会动态生成方法(比如SQLAlchemy),这时候别硬刚,直接去查ORM的文档更靠谱


我现在带新人都会先说:先用dir()扫个大概,复杂类上help(),读开源代码必用IDE的结构视图。就像学做菜先认调料再学刀工,别一上来就想玩满汉全席。特别是调试的时候,别傻乎乎地打印整个类结构——昨天看见实习生把200多个方法的类结构打印出来,电脑风扇都转起飞了...

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