python 的 魔术变量, 这几个你必须要知道

📅 2026/7/2 23:40:07
python 的 魔术变量, 这几个你必须要知道
好的我以requests库为素材逐个演示这些魔术变量的实际作用和输出1.__file__- 模块文件路径作用告诉你这个模块从磁盘的哪个位置加载的常用于定位配置文件、资源文件。importrequestsimportosprint(requests.__file__)# 输出/usr/local/lib/python3.9/site-packages/requests/__init__.py# 实用技巧获取库所在目录lib_diros.path.dirname(requests.__file__)print(lib_dir)# 输出/usr/local/lib/python3.9/site-packages/requests2.__name__- 模块名称作用判断模块是作为主程序运行还是被导入在requests源码中用于条件导入和测试。importrequestsprint(requests.__name__)# 输出requests# 在 requests 源码中requests/__init__.py 里# 如果直接运行这个文件if__name____main__:# 执行测试代码print(Testing requests...)# 如果是被导入import requests则 __name__ requests在你自己代码中的应用# 你的脚本my_script.pyif__name____main__:# 这个代码块只在直接运行 my_script.py 时执行# 如果其他文件 import my_script这里不会执行responserequests.get(https://api.github.com)print(response.status_code)3.__package__- 所属包名作用表示模块在包结构中的位置用于相对导入。importrequestsprint(requests.__package__)# 输出requests# 对比子模块fromrequestsimportapiprint(api.__package__)# 输出requests# 说明 api 模块属于 requests 包4.__doc__- 文档字符串作用存储模块/类/函数的文档说明用help()或print()查看。importrequestsprint(requests.__doc__)# 输出简化版# Requests HTTP Library## Requests is an HTTP library, written in Python, for human beings.# Basic GET usage:## import requests# r requests.get(https://www.python.org)# r.status_code# 200# # 也可以查看具体函数的文档print(requests.get.__doc__)# 输出 get 函数的详细说明# 实际应用动态生成文档defmy_function():这是一个示例函数passprint(my_function.__doc__)# 输出这是一个示例函数5.__dict__- 属性字典作用查看对象的所有属性和方法调试和动态访问属性时非常有用。importrequests# 查看模块级别的所有属性print(requests.__dict__.keys())# 输出dict_keys([__name__, __doc__, __package__, ..., get, post, Session])# 查看响应对象的属性responserequests.get(https://httpbin.org/get)print(response.__dict__.keys())# 输出dict_keys([_content, status_code, headers, url, history, encoding, cookies, elapsed])# 实用技巧动态获取属性attr_namestatus_codeifattr_nameinresponse.__dict__:print(getattr(response,attr_name))# 输出200# 查看某个具体属性的值print(response.__dict__[status_code])# 输出2006.__all__- 导出列表作用控制from requests import *会导入哪些名称保护模块内部实现。importrequestsprint(requests.__all__)# 输出简化版# [__version__, __build__, __author__, __author_email__, __license__,# __copyright__, __url__, get, post, put, patch, delete, head,# options, Session, session, Response, Request, RequestException, ...]# 实际测试fromrequestsimport*# 只会导入 __all__ 中列出的名称print(dir())# 可以看到只有 get, post, Session 等被导入# 而 requests 内部使用的 utils, adapters 等不会被导入7.__path__- 包搜索路径作用告诉 Python 解释器这个包的子模块在哪些目录下搜索仅包才有普通模块没有。importrequestsprint(requests.__path__)# 输出[/usr/local/lib/python3.9/site-packages/requests]# 实际应用动态扩展包路径高级用法# 比如让 requests 支持从其他目录加载自定义适配器# requests.__path__.append(/my/custom/requests/plugins)8.__class__- 实例所属类作用获取实例的类信息用于反射、动态类型判断。importrequests responserequests.get(https://httpbin.org/get)print(response.__class__)# 输出class requests.models.Responseprint(response.__class__.__name__)# 输出Response# 实用技巧类型检查ifresponse.__class__.__name__Response:print(这是一个 Response 对象)# 也可以使用 type()但 __class__ 更直接print(type(response)response.__class__)# 输出True9.__module__- 所属模块名作用记录函数/类定义在哪个模块中常用于序列化、调试。importrequests# 查看函数的所属模块print(requests.get.__module__)# 输出requests.api# 说明 get 函数定义在 requests/api.py 中# 查看类的所属模块print(requests.models.Response.__module__)# 输出requests.models# 说明 Response 类定义在 requests/models.py 中# 实用场景动态导入defimport_from_string(module_name,class_name):module__import__(module_name,fromlist[class_name])returngetattr(module,class_name)# 根据 __module__ 重建对象response_classimport_from_string(requests.models.Response.__module__,requests.models.Response.__name__)print(response_class)# 输出class requests.models.Response综合实战示例结合多个魔术变量写一个调试工具importrequestsimportinspectdefinspect_module(module):通用模块信息查看器print(f模块名称:{module.__name__})print(f文件位置:{module.__file__})print(f所属包:{module.__package__})print(f文档:{module.__doc__[:50]}...)# 截断显示print(f导出列表:{module.__all__[:5]}...)# 显示前5个ifhasattr(module,__path__):print(f包路径:{module.__path__})# 使用inspect_module(requests)# 输出# 模块名称: requests# 文件位置: /usr/local/lib/python3.9/site-packages/requests/__init__.py# 所属包: requests# 文档: Requests HTTP Library...# 导出列表: [__version__, __build__, __author__, __author_email__, __license__]...# 包路径: [/usr/local/lib/python3.9/site-packages/requests]快速记忆表魔术变量一句话记忆实战用途__file__我在哪定位配置文件__name__我是谁if __name__ __main____package__我属于哪个包相对导入__doc__说明书生成文档、help()__dict__我的所有属性调试、动态访问__all__我公开什么控制import *__path__我去哪找子模块包路径扩展__class__我是哪个类的实例类型判断__module__我来自哪个文件序列化、动态导入这些魔术变量是 Python 自省的基石掌握它们能让你写调试工具、动态加载代码、元编程事半功倍