大忽悠喵 发表于 2019-3-12 10:17:39

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

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

      self.__dict__ = value

import sys
sys.modules = Const()

这个最后一句sys.modules = Const()   小甲鱼说可以将你的模块与类Const的对象挂钩是什么意思啊不太明白,求大佬解释一下谢谢

大忽悠喵 发表于 2019-3-13 19:19:43

顶一下

梅花千朵仓九公 发表于 2019-5-27 15:37:27

同求答案

Vicissitude357 发表于 2022-9-4 10:43:26

顶一下

阿奇_o 发表于 2022-9-4 13:22:41

本帖最后由 阿奇_o 于 2022-9-4 13:36 编辑

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

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


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

页: [1]
查看完整版本: 关于sys.modules方法的一点疑问