鱼C论坛

 找回密码
 立即注册
查看: 2501|回复: 4

关于sys.modules方法的一点疑问

[复制链接]
发表于 2019-3-12 10:17:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 该模块用于让 Python 支持常量操作
class Const:   
    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise TypeError('常量无法改变!')
            
        if not name.isupper():
            raise TypeError('常量名必须由大写字母组成!')

        self.__dict__[name] = value

import sys
sys.modules[__name__] = Const()

这个最后一句sys.modules[__name__] = Const()   小甲鱼说可以将你的模块与类Const的对象挂钩是什么意思啊不太明白,求大佬解释一下谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-13 19:19:43 | 显示全部楼层
顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-27 15:37:27 | 显示全部楼层
同求答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 10:43:26 | 显示全部楼层
顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-4 13:22:41 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-9-4 13:36 编辑

这种属于“小技巧”,很少见的hack, 只是方便你调用 某个常要用到的 类的实例(如这里的Const类的实例:Const()  ), 那么,
你可以 通过 sys.modules[__name__] = Const()  这样来实现,
来 将 实例对象 绑定到 其模块上,方便作为模块导入时,即 当 python -m my_const   # 假设这个类定义在 my_const.py这个模块里,运行这句代码,就改变了 __name__ 原来的 __main__  变为 __main__.Const object 即你作为模块导入时,就因为 sys.modules[__name__] = Const() 这句代码而改变了(黑掉了)原来的机制 —— 如,原来你 每次需要在另一模块或脚本里 使用这个 my_const 模块里的Const 时,每次都需要手动 from my_const import Const   然后创建和绑定 const = Const()  ,现在 你直接 import my_const  就完成导入、创建和绑定等多个步骤,多合一!  ( 程序猿就这么懒~_

为了搞明白,你可以分别创建 my_const.py 和 test_const.py 这两个模块,然后作为不同的测试……  


。。 你们自己折腾吧(本来就是“黑魔法”),要完全说明白,估计要一大篇文章。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表