鱼C论坛

 找回密码
 立即注册
查看: 2643|回复: 2

[已解决]第一版50讲:模块 课后作业最后一题 关于sys.modules的疑问

[复制链接]
发表于 2022-12-20 13:59:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Summerwww 于 2022-12-20 14:07 编辑

# 该const.py模块用于让 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()


#在源码中测试

import const

const.NAME = "FishC"
print(const.NAME)

try:
    # 尝试修改常量
    const.NAME = "FishC.com"
except TypeError as Err:
    print(Err)

try:
    # 变量名需要大写
    const.name = "FishC"
except TypeError as Err:
    print(Err)


我的疑问是这里的sys.modules[__name__] = Const()    到底是什么意思??后面的const.NAME = "FishC" 中得const怎么就成类Const的对象了???const是文件的名字啊,也就是模块的名字,怎么转化了一下成模块里类的对象了???
最佳答案
2022-12-20 14:13:02
本帖最后由 lxping 于 2022-12-20 14:15 编辑

sys.modules是一个字典,它包含了从Python开始运行起,被导入的所有模块,
而 sys.modules[__name__] 的值为对应模块const的名字const,通过 sys.modules[__name__] = Const()用类对象替换模块对象,
当使用import const时,会发生sys.modules[const] = Const();
而访问const.NAME时会发生sys.modules[const].NAME,即 Const().NAME
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-20 14:13:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 lxping 于 2022-12-20 14:15 编辑

sys.modules是一个字典,它包含了从Python开始运行起,被导入的所有模块,
而 sys.modules[__name__] 的值为对应模块const的名字const,通过 sys.modules[__name__] = Const()用类对象替换模块对象,
当使用import const时,会发生sys.modules[const] = Const();
而访问const.NAME时会发生sys.modules[const].NAME,即 Const().NAME
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-20 17:35:42 | 显示全部楼层
本帖最后由 Summerwww 于 2022-12-20 18:45 编辑

#自己写的const模块
class Const:
    def __setattr__(self,name,value):
        try:
            super().__getattr__(name)
        except:
            if name.isupper():
                super().__setattr__(name,value)
            else:
                raise TypeError('常量名必须由大写字母组成!')
        else:
            raise TypeError('常量无法改变!')
        
import sys
sys.modules[__name__] = Const()     



当const.NAME = 'FishC'后
我修改const.NAME = 'FishC.com'时应该报TypeError('常量无法改变!')
但是我写的这个不报错,不知道问题出在哪了????我想了很久没想明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 07:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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