wuyanzulqq 发表于 2020-12-9 18:46:22

python50讲模块求回答急急急!

本帖最后由 wuyanzulqq 于 2020-12-9 18:53 编辑

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

这个段的意思是添加新的键/值到字典里,可这个指的是什么字典?{:10_285:}
问题:问大家一个问题:Python 支持常量吗?相信很多鱼油的答案都是否定的,但实际上 Python 内建的命名空间是支持一小部分常量的,比如我们熟悉的 True,False,None 等,只是 Python 没有提供定义常量的直接方式而已。那么这一题的要求是创建一个 const 模块,功能是让 Python 支持常量
提示一:我们需要一个 Const 类
提示二:重写 Const 类的某一个魔法方法,指定当实例对象的属性被修改时的行为
提示三:检查该属性是否已存在
提示四:检查该属性的名字是否为大写
提示五:细心的鱼油可能发现了,怎么我们这个 const 模块导入之后就把它当对象来使用(const.NAME = "FishC")了呢?难道模块也可以是一个对象?没错啦,在 Python 中无处不对象,到处都是你的对象。使用以下方法可以将你的模块与类 A 的对象挂钩。

笨鸟学飞 发表于 2020-12-9 18:46:23

转自:https://www.cnblogs.com/zhaojingyu/p/9069076.html

python sys.modules模块
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules都将记录这些模块。字典sys.modules对于加载模块起到了缓冲的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。

字典sys.modules具有字典所拥有的一切方法,可以通过这些方法了解当前的环境加载了哪些模块

    importsys

    print sys.modules.keys()

    print sys.modules.values()

    print sys.modules["os"]

======因此你发的代码执行过程如下:
import sys# 引入模块
sys.modules = Const()# 把对象Const实例化,赋值给当前py程序(__name__)的一个全局字典
设置对象属性时,默认调用__setattr__方法,因此在此处加判断,就可以让里面的属性和常量一样,例如不能修改值

wuyanzulqq 发表于 2020-12-9 21:54:09

笨鸟学飞 发表于 2020-12-9 20:53
转自:https://www.cnblogs.com/zhaojingyu/p/9069076.html

python sys.modules模块


哦哦 import sys 导入了一个模块 所以在当前代码块里__name__不是__main__了 而是const了 所以const是Const的实例对象 所以模块const就和类挂钩了 就能 const.ooxx了
我理解的对吗{:10_256:}

笨鸟学飞 发表于 2020-12-9 22:20:25

不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules 就是在内存中加载了一个test.py的全局字典
sys.modules = Const() 意思这个字典是通过实例化Const对象赋值的

wuyanzulqq 发表于 2020-12-10 08:57:36

笨鸟学飞 发表于 2020-12-9 22:20
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules 就是在内 ...

我明白你的意思了,可我还有一个疑问 就是我没有写=Const()的情况下,sys.modules是<module '__main__' (built-in)>这样的啊{:5_94:}

wuyanzulqq 发表于 2020-12-10 09:02:42

笨鸟学飞 发表于 2020-12-9 22:20
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules 就是在内 ...

昨天晚上有些困 所以脑子有些缓不过来 请谅解{:10_291:}

笨鸟学飞 发表于 2020-12-10 09:04:20

wuyanzulqq 发表于 2020-12-10 08:57
我明白你的意思了,可我还有一个疑问 就是我没有写=Const()的情况下,sys.modules是这样的啊{:5 ...

你都学到50课了,那你应该明白
if __name__ == '__main__'
是啥吧?

wuyanzulqq 发表于 2020-12-10 18:28:10

笨鸟学飞 发表于 2020-12-9 22:20
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules 就是在内 ...

谢谢大佬,我。。太蠢了,现在才理解{:10_282:}
页: [1]
查看完整版本: python50讲模块求回答急急急!