Python实现Const详解
python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能
定义const类如下
importsys classConst(object): classConstError(TypeException):pass def__setattr__(self,key,value): ifself.__dict__.has_key(key): raiseself.ConstError,"Changingconst.%s"%key else: self.__dict__[key]=value def__getattr__(self,key): ifself.__dict__.has_key(key): returnself.key else: returnNone sys.modules[__name__]=Const()
使用sys.modules[name]可以获取一个模块对象,并可以通过该对象获取模块的属性,这儿使用了sys.modules向系统字典中注入了一个Const对象从而实现了在执行importconst时实际获取了一个Const实例的功能,sys.module在文档中的描述如下
sys.modules
Thisisadictionarythatmapsmodulenamestomoduleswhichhavealreadybeenloaded.Thiscanbemanipulatedtoforcereloadingofmodulesandothertricks.Notethatremovingamodulefromthisdictionaryisnotthesameascallingreload()onthecorrespondingmoduleobject.
sys.modules[name]=Const()这条语句将系统已加载的模块列表中的const替换为了Const(),即一个Const实例
这样,整个工程需要使用的常量都应该定义在一个文件中,如下
fromproject.utilsimportconst const.MAIL_PROTO_IMAP='imap' const.MAIL_PROTO_GMAIL='gmail' const.MAIL_PROTO_HOTMAIL='hotmail' const.MAIL_PROTO_EAS='eas' const.MAIL_PROTO_EWS='ews'
这儿首先需要说明python中importmodule和frommoduleimport的区别
importmodule只是将module的name加入到目标文件的局部字典中,不需要对module进行解释
frommoduleimportxxx需要将module解释后加载至内存中,再将相应部分加入目标文件的局部字典中
python模块中的代码仅在首次被import时被执行一次
fromproject.utilsimportconst时,发生了sys.modules[name]=Const(),此时const模块已经加载进入内存,系统字典中也已经有了Const对象,随后既可以使用Const实例了
在其他文件中需要使用常量值时,以如下方式调用
fromproject.apps.project_constsimportconst printconst.MAIL_PROTO_IMAP