|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. 代码如下
# 该模块用于让 Python 支持常量操作, 模块名 constT.py
class Const:
def __getattr__(self, name):
print('常量不存在')
def __getattribute__(self, name):
super().__getattribute__(name)
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()
2.
在运行后报错
>>> import constT as co
>>> co.NAME = 1
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
co.NAME = 1
File "E:\python files\IDEL FILES\My py file\课后习题\constT.py", line 10, in __setattr__
if name in self.__dict__:
TypeError: argument of type 'NoneType' is not iterable
3.
这里执行co.__dict__是None.
4.
如果我把前面一句改成:
def __getattribute__(self, name):
return super().__getattribute__(name)
co.__dict__就是一个空的字典,就不报错了。
5.
我的问题就在这里,为什么不加return的时候co.__dict__是None, 加return之后co.__dict__是一个空的字典,请指教。
我说下我自己的看法,不一定对,有错误请指教:
1、函数不加return的话,默认是返回None,这是return的基础定义。
也就是你出错的原因,因为None不支持迭代。
2、加了return之后,返回的是基类属性访问拦截器,虽然是个空的字典,但起码支持迭代,所以没有报错。
|
|