大地郡主 发表于 2020-7-18 18:54:30

050课作业问题,求助!

请帮我康康这段小代码,不知道为什么错了,哪位大佬看到我的代码后如果有任何建议都请写下来!写法,格式,不管是多小的建议都行,谢谢您们!


class Const:
    def __init__(self):
      self.all_chang = {}
      
    def __setattr__(self, name, value):
      if check(name):
            raise TypeError('常量无法改变!')
      else:
            self.all_chang.setdefault(name,value)
            return __setattr__(name, value)

    def check(self, string):
      if self.string.isupper():
            if string in all_chang:
                return 1
            else:
                return 0
      else:
            raise TypeError('常量名必须由大写字母组成!')

import sys
sys.modules = Const()



底下是我的报错
Traceback (most recent call last):
File "E:/xiaojiayu/050 0.py", line 22, in <module>
    sys.modules = Const()
File "E:/xiaojiayu/050 0.py", line 3, in __init__
    self.all_chang = {}
File "E:/xiaojiayu/050 0.py", line 6, in __setattr__
    if check(name):
NameError: name 'check' is not defined

zltzlt 发表于 2020-7-18 18:56:02

本帖最后由 zltzlt 于 2020-7-18 18:57 编辑

应该是 self.check 不是 check,string 不是 self.string。试试这样:

class Const:
    def __init__(self):
      self.all_chang = {}
      
    def __setattr__(self, name, value):
      if self.check(name):
            raise TypeError('常量无法改变!')
      else:
            self.all_chang.setdefault(name,value)
            return __setattr__(name, value)

    def check(self, string):
      if string.isupper():
            if string in all_chang:
                return 1
            else:
                return 0
      else:
            raise TypeError('常量名必须由大写字母组成!')

import sys
sys.modules = Const()

大地郡主 发表于 2020-7-18 19:06:19

zltzlt 发表于 2020-7-18 18:56
应该是 self.check 不是 check,string 不是 self.string。试试这样:

不行啊,运行后比刚才错误还多一个{:10_266:}

zltzlt 发表于 2020-7-18 19:06:42

大地郡主 发表于 2020-7-18 19:06
不行啊,运行后比刚才错误还多一个

报的什么错呢?

zltzlt 发表于 2020-7-18 19:07:29

大地郡主 发表于 2020-7-18 19:06
不行啊,运行后比刚才错误还多一个

这样行不行:

class Const:
    def __init__(self):
      self.all_chang = {}
      
    def __setattr__(self, name, value):
      if self.check(name):
            raise TypeError('常量无法改变!')
      else:
            self.all_chang.setdefault(name, value)
            return self.__setattr__(name, value)

    def check(self, string):
      if string.isupper():
            if string in all_chang:
                return 1
            else:
                return 0
      else:
            raise TypeError('常量名必须由大写字母组成!')

import sys
sys.modules = Const()

大地郡主 发表于 2020-7-18 19:09:16

zltzlt 发表于 2020-7-18 19:07
这样行不行:

还是不行,报错是这个
Traceback (most recent call last):
File "E:/xiaojiayu/050 0.py", line 22, in <module>
    sys.modules = Const()
File "E:/xiaojiayu/050 0.py", line 3, in __init__
    self.all_chang = {}
File "E:/xiaojiayu/050 0.py", line 6, in __setattr__
    if self.check(name):
File "E:/xiaojiayu/050 0.py", line 19, in check
    raise TypeError('常量名必须由大写字母组成!')
TypeError: 常量名必须由大写字母组成!

Twilight6 发表于 2020-7-18 19:38:33

大地郡主 发表于 2020-7-18 19:09
还是不行,报错是这个
Traceback (most recent call last):
File "E:/xiaojiayu/050 0.py", line 22, ...


代码改成这样:
class Const:
    def __setattr__(self, name, value):
      if self.check(name):
            raise TypeError('常量无法改变!')
      else:
            return super().__setattr__(name, value)

    def check(self, string):
      if string.isupper():
            if string in self.__dict__:
                return 1
            else:
                return 0
      else:
            raise TypeError('常量名必须由大写字母组成!')


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)

zltzlt 发表于 2020-7-18 19:40:20

帮你修改好了:

class Const:
    def __init__(self):
      self.all_chang = {}

    def __setattr__(self, name, value):
      if name != 'all_chang' and self.check(name):
            raise TypeError('常量无法改变!')
      elif name == 'all_chang':
            super().__setattr__(name, {})
      else:
            self.all_chang.setdefault(name, value)
            super().__setattr__(name, value)

    def check(self, string):
      if string.isupper():
            if string in self.all_chang:
                return 1
            else:
                return 0
      else:
            raise TypeError('常量名必须由大写字母组成!')


import sys

sys.modules = Const()

大地郡主 发表于 2020-7-20 09:47:27

zltzlt 发表于 2020-7-18 19:40
帮你修改好了:

谢谢您!
页: [1]
查看完整版本: 050课作业问题,求助!