第一版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: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 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]