googleapiclient Resource对象files()方法工作原理解惑请求
关于Google API Python Client中Resource实例动态调用
files()方法的疑问 在Google Drive API Python文档的示例代码中,有这样一行:
file = service.files().create(...)
其中service是googleapiclient.discovery.build()返回的Resource类实例。
我感到困惑的是:files()并非Resource类定义中的成员方法,但这段代码却能正常运行(甚至官方示例里需要显式禁用pylint的错误提示)。
我尝试用以下代码查看service.files的源码:
import inspect print(inspect.getsource(service.files))
发现它指向Resource类定义中的某个位置,但依旧无法理解其工作机制,希望有人能解惑。
解惑:动态生成子资源的原理
google-api-python-client库中的Resource类利用Python的__getattr__魔术方法实现了动态属性的功能,这就是为什么你找不到files()这类方法的硬编码定义,但却能调用它的原因:
- 当你调用
service.files时,Python会先在Resource实例的属性中查找files,找不到的话就会触发__getattr__方法 __getattr__会根据Google API的Discovery文档(这是build()方法初始化时加载的API元数据),动态创建一个对应的子Resource实例,对应Drive API中的"files"资源- 这个动态生成的子资源对象同样具备
create()、list()等方法,这些方法也是根据Discovery文档中的接口定义动态生成的 - 正因为这些方法是运行时动态创建的,而非类定义时静态声明的,所以pylint这类静态分析工具会报错,官方示例才需要显式禁用相关错误
简单来说,Resource类是一个通用的容器,它会根据API的元数据在运行时动态生成对应资源的操作方法,而不是提前把所有API方法都写死在代码里。
内容的提问来源于stack exchange,提问作者JerryDeveloper
相关产品推荐
相关产品推荐

