You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中获取类property属性的源代码?

为什么inspect.findsource()搞不定property,以及如何获取property的源代码

你遇到的问题其实是因为inspect.findsource()的设计目标是处理直接关联到代码对象的实体——比如类、函数、方法这些,但property本质是个描述器实例,它本身不是代码块的直接载体。你看到的pandas.DataFrame.iloc是property类的对象,它内部封装了真正干活的getter/setter方法,但这个实例本身并没有绑定到可被inspect识别的代码对象,所以直接传进去会报错。

下面给你两种可行的解决办法:

方法1:拿到property的getter方法再处理

每个property实例都有fget、fset、fdel属性,分别对应获取、设置、删除属性的底层方法。我们只需要取出fget(也就是实际处理iloc获取逻辑的函数),再用inspect工具处理这个函数就行:

import pandas
import inspect

# 获取iloc对应的getter方法
iloc_getter = pandas.DataFrame.iloc.fget
# 获取源码内容和起始行号
source_lines, start_line = inspect.findsource(iloc_getter)
# 或者直接获取源码文本
source_text = inspect.getsource(iloc_getter)
# 获取源文件路径
source_file_path = inspect.getsourcefile(iloc_getter)

方法2:从类的__dict__中定位property定义

如果你想找到@property装饰器在类中定义的位置,可以直接从类的__dict__里取出对应的property对象,再通过它的fget来追踪源码:

import pandas
import inspect

# 从DataFrame的类字典中拿到iloc的property实例
iloc_prop = pandas.DataFrame.__dict__['iloc']
# 获取源文件路径
source_file = inspect.getsourcefile(iloc_prop.fget)
# 获取源码行和起始行号
lines, start_line = inspect.getsourcelines(iloc_prop.fget)

额外注意点

  • 有些pandas的核心property可能是用C扩展实现的,这时候inspect无法获取Python源码,会抛出OSError,这种情况只能去看对应的C源码或者官方文档。
  • 如果property是从父类继承来的,通过fget也能追踪到它最初被定义的类的源码,不用担心找不到源头。

内容的提问来源于stack exchange,提问作者Ida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:55