鱼C论坛

 找回密码
 立即注册
查看: 2448|回复: 7

[已解决]python50讲模块求回答急急急!

[复制链接]
发表于 2020-12-9 18:46:22 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 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__[name] = value

import sys
sys.modules[__name__] = Const()

这个段的意思是添加新的键/值到字典里,可这个指的是什么字典?
问题:问大家一个问题: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具有字典所拥有的一切方法,可以通过这些方法了解当前的环境加载了哪些模块

    import  sys

    print sys.modules.keys()

    print sys.modules.values()

    print sys.modules["os"]

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

最佳答案

查看完整内容

转自:https://www.cnblogs.com/zhaojingyu/p/9069076.html python sys.modules模块 sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules都将记录这些模块。字典sys.modules对于加载模块起到了缓冲的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。 字典sys.modules具有字 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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具有字典所拥有的一切方法,可以通过这些方法了解当前的环境加载了哪些模块

    import  sys

    print sys.modules.keys()

    print sys.modules.values()

    print sys.modules["os"]

======因此你发的代码执行过程如下:
import sys  # 引入模块
sys.modules[__name__] = Const()  # 把对象Const实例化,赋值给当前py程序(__name__)的一个全局字典
设置对象属性时,默认调用__setattr__方法,因此在此处加判断,就可以让里面的属性和常量一样,例如不能修改值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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了
我理解的对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-9 22:20:25 | 显示全部楼层
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules[__name__] 就是在内存中加载了一个test.py的全局字典
sys.modules[__name__] = Const() 意思这个字典是通过实例化Const对象赋值的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-10 08:57:36 | 显示全部楼层
笨鸟学飞 发表于 2020-12-9 22:20
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules[__name__] 就是在内 ...

我明白你的意思了,可我还有一个疑问 就是我没有写=Const()的情况下,sys.modules[__name__]是
<module '__main__' (built-in)>
这样的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-10 09:02:42 | 显示全部楼层
笨鸟学飞 发表于 2020-12-9 22:20
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules[__name__] 就是在内 ...

昨天晚上有些困 所以脑子有些缓不过来 请谅解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-10 09:04:20 | 显示全部楼层
wuyanzulqq 发表于 2020-12-10 08:57
我明白你的意思了,可我还有一个疑问 就是我没有写=Const()的情况下,sys.modules[__name__]是这样的啊{:5 ...

你都学到50课了,那你应该明白
if __name__ == '__main__'
是啥吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-10 18:28:10 | 显示全部楼层
笨鸟学飞 发表于 2020-12-9 22:20
不是啊,例如你写的这个python程序叫test.py
__name__就是你这个test.py
sys.modules[__name__] 就是在内 ...

谢谢大佬,我。。太蠢了,现在才理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 02:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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