sonichuang 发表于 2019-1-14 23:59:26

python中在__getattribute__中return的作用

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__ = value

import sys
sys.modules = 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__是一个空的字典,请指教。

heidern0612 发表于 2019-1-15 12:52:36

我说下我自己的看法,不一定对,有错误请指教:

1、函数不加return的话,默认是返回None,这是return的基础定义。

          也就是你出错的原因,因为None不支持迭代。

2、加了return之后,返回的是基类属性访问拦截器,虽然是个空的字典,但起码支持迭代,所以没有报错。
页: [1]
查看完整版本: python中在__getattribute__中return的作用