zoukankan      html  css  js  c++  java
  • Python实现Const

    Python实现const

    Python实现const

    python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能

    定义const类如下

    import sys
    
    class Const(object):
        class ConstError(TypeException): pass
        def __setattr__(self, key, value):
            if self.__dict__.has_key(key):
                raise self.ConstError, "Changing const.%s" % key
            else:
                self.__dict__[key] = value
    
        def __getattr__(self, key):
            if self.__dict__.has_key(key):
                return self.key
            else:
                return None
    
    sys.modules[__name__] = Const()
    

    使用sys.modules[name]可以获取一个模块对象,并可以通过该对象获取模块的属性,这儿使用了sys.modules向系统字典中注入了一个Const对象从而实现了在执行import const时实际获取了一个Const实例的功能,sys.module在文档中的描述如下

    sys.modules
    This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks. Note that removing a module from this dictionary is not the same as calling reload() on the corresponding module object.
    

    sys.modules[name] = Const()这条语句将系统已加载的模块列表中的const替换为了Const(),即一个Const实例

    这样,整个工程需要使用的常量都应该定义在一个文件中,如下

    from project.utils import const
    
    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中import module和from module import的区别

    • import module只是将module的name加入到目标文件的局部字典中,不需要对module进行解释
    • from module import xxx需要将module解释后加载至内存中,再将相应部分加入目标文件的局部字典中
    • python模块中的代码仅在首次被import时被执行一次

    from project.utils import const时,发生了sys.modules[name] = Const(),此时const模块已经加载进入内存,系统字典中也已经有了Const对象,随后既可以使用Const实例了

    在其他文件中需要使用常量值时,以如下方式调用

    from project.apps.project_consts import const
    
    print const.MAIL_PROTO_IMAP
    
  • 相关阅读:
    假期训练七(hdu-2845 dp,hdu-1846,2188 巴什博奕)
    假期训练六(poj-1753,递归+hdu-2844,多重背包)
    假期训练五(poj-1077bfs+康拓展开,hdu-2577dp)
    1-10假期训练(hdu-2059 简单dp)
    1-9-假期训练心得(dp+bfs)
    如何在IntelliJ Idea中同时启动不同端口的两个实例
    搭建Springboot监控中心报错A attempt was made to call the method reactor.retry.Retry.retryMax(I)Lreactor/ret)
    使用spring中遇到"java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor"问题
    mvc:annotation-driven的前缀 "mvc"未绑定
    使用Idea构建springmvc框架,出现no bean named 'cacheManager' is defined 错误
  • 原文地址:https://www.cnblogs.com/current/p/4252516.html
Copyright © 2011-2022 走看看