Summerwww 发表于 2022-12-20 13:59:34

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

本帖最后由 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__ = value

import sys
sys.modules = 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 = Const()    到底是什么意思??后面的const.NAME = "FishC" 中得const怎么就成类Const的对象了???const是文件的名字啊,也就是模块的名字,怎么转化了一下成模块里类的对象了???

lxping 发表于 2022-12-20 14:13:02

本帖最后由 lxping 于 2022-12-20 14:15 编辑

sys.modules是一个字典,它包含了从Python开始运行起,被导入的所有模块,
而 sys.modules 的值为对应模块const的名字const,通过 sys.modules = Const()用类对象替换模块对象,
当使用import const时,会发生sys.modules = Const();
而访问const.NAME时会发生sys.modules.NAME,即 Const().NAME

Summerwww 发表于 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 = Const()   



当const.NAME = 'FishC'后
我修改const.NAME = 'FishC.com'时应该报TypeError('常量无法改变!')
但是我写的这个不报错,不知道问题出在哪了????我想了很久没想明白
页: [1]
查看完整版本: 第一版50讲:模块 课后作业最后一题 关于sys.modules的疑问