按命名风格,常量名所有字母大写,用下划线连接各个单词,然而这种方式并没有实现真正的常量,其对应的值仍然可以改变。
最好的方法,是通过自定义类实现常量功能。
下面的例子,要求符合“命名全部为大写”和“值一旦绑定便不可再修改”两个条件。
const.py
class _const(object):
class ConstError(TypeError):pass # TypeError 指对类型无效的操作
class ConstCaseError(ConstError):pass
def __setattr__(self, key, value): # 在对类的属性赋值时会自动调用
if key in self.__dict__: # object.__dict__以dict的形式保存了object内所有可写的属性,name为变量名,value为变量值。
raise self.ConstError("Can't change const.%s" % key)
if not key.isupper():
raise self.ConstCaseError("const name '%s' is not all uppercase" % key)
self.__dict__[key] = value
import sys
sys.modules[__name__] = _const()
# sys.modules保存有当前Python环境中已经导入的模块记录,这是一个全局字典,当Python启动后就加载在内存中。
# dict的key为文件名,value为模块对象。
# __name__就是标识模块的名字的一个系统变量。
# sys.modules['const'] = _const()
# 即,让_const类作为模块的入口点,引入const.py等价于声明了一个_const类的实例。
声明常量,将存放常量的文件命名为constant.py:
import const
const.COMPANY = 'IBM'
const.MY_CONST = 'ABC'
当其他模块引用常量时,按照如下方式进行即可:
from constant import const
print(const.COMPANY)
print(const.MY_CONST+'d')