全视之眼 发表于 2022-1-6 23:33:32

零基础入门学python50讲模块的动动手答案,有异常,求解释

0. 问大家一个问题:Python 支持常量吗?相信很多鱼油的答案都是否定的,但实际上 Python 内建的命名空间是支持一小部分常量的,比如我们熟悉的 True,False,None 等,只是 Python 没有提供定义常量的直接方式而已。那么这一题的要求是创建一个 const 模块,功能是让 Python 支持常量。CYP%5hbR{
no+k:z3~RM07I"ZGSLmbwguK|NV;y
说到这里大家可能还是一头雾水,没关系,我们举个栗子。:wFr`uk
V^%jmWX0zaTP&LF,o+Jqk*$
test.py 是我们的测试代码,内容如下:>$TfOyl0
# const 模块就是这道题要求我们自己写的
# const 模块用于让 Python 支持常量操作
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)
复制代码

执行后的结果是:版权属于:bbs.fishc.com
>>>
FishC
常量无法改变!
常量名必须由大写字母组成!
复制代码

在 const 模块中我们到底做了什么,使得这个模块这么有“魔力”呢?大家跟着小甲鱼的提示,一步步来做你就懂了:'AL^`vsa
2e:<=mLM^(PH$4>uN-1Fo%!pxnJ
提示一:我们需要一个 Const 类
提示二:重写 Const 类的某一个魔法方法,指定当实例对象的属性被修改时的行为
提示三:检查该属性是否已存在
提示四:检查该属性的名字是否为大写
提示五:细心的鱼油可能发现了,怎么我们这个 const 模块导入之后就把它当对象来使用(const.NAME = "FishC")了呢?难道模块也可以是一个对象?没错啦,在 Python 中无处不对象,到处都是你的对象。使用以下方法可以将你的模块与类 A 的对象挂钩。

'''
sys.modules 是一个字典,它包含了从 Python 开始运行起,被导入的所有模块。键就是模块名,值就是模块对象。
'''
import sys
sys.modules = A()
复制代码

呃……好像说得有点太多了,大家一定要自己动手先尝试完成哦~>UAJ41
4e%7tDwmO@T+EaWk|~co>'M
代码清单:Powered by bbs.fishc.com
# 该模块用于让 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()

以上是小甲鱼的答案,但是我在iPad的 python3IDE APP上运行之后,发现两个都会报错,原因是导入模块报错之后会影响类定义那边,进而导致类定义那边也报错。导入那边报错显示的是 导入错误:找不到__import__,类定义那边报错显示的是NameError:__build_class__not

跪求大神给我解释,我快崩溃了,怎么调试都不行&#128557;&#128557;&#128557;

xiaosi4081 发表于 2022-1-8 15:32:43

换电脑端
页: [1]
查看完整版本: 零基础入门学python50讲模块的动动手答案,有异常,求解释