|
发表于 2015-8-18 03:36:14
|
显示全部楼层
因为它作为模块导入的时候,整个文件就是一个模块对象(Python处处都是对象……),因此 "模块名.常量名" 的语句相当于 "实例对象.属性",这个属性肯定受 __setattr__() 方法的约束。
而你这里直接将模块执行,在 IDLE 中对其类(类也是对象)进行赋值,而不是对类的实例化对象赋值,所以不会受 __setattr__() 影响(__setattr__() 是干预实例化对象而不是类对象的,还记得吧?)。
如果想在 IDLE 中实现类似的效果,那需要先将 Const 类实例化,你可以这么做:
- >>> test = Const()
- >>> test.NAME = "FishC"
- >>> test.NAME = "FishC.com"
- Traceback (most recent call last):
- File "<pyshell#9>", line 1, in <module>
- test.NAME = "FishC.com"
- File "C:\Users\佳宇\Desktop\const.py", line 4, in __setattr__
- raise TypeError('常量无法改变!')
- TypeError: 常量无法改变!
复制代码
另外,最后两条语句的作用是将该模块对象作为类的实例对象:
- import sys
- sys.modules[__name__] = Const()
复制代码
因此,你还可以这么做:
- >>> print(sys.modules[__name__])
- <__main__.Const object at 0x034D8930>
- >>> sys.modules[__name__].NAME = "FishC"
- >>> sys.modules[__name__].NAME = "FishC.com"
- Traceback (most recent call last):
- File "<pyshell#14>", line 1, in <module>
- sys.modules[__name__].NAME = "FishC.com"
- File "C:\Users\佳宇\Desktop\const.py", line 4, in __setattr__
- raise TypeError('常量无法改变!')
- TypeError: 常量无法改变!
复制代码
Python 看上去是很简单,但它也可以很复杂,对吧?
 |
评分
-
查看全部评分
|