Python実装Const詳細

2257 ワード

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インスタンスに置き換えます.
このように、プロジェクト全体で使用する定数は、次のように1つのファイルに定義する必要があります.
 
  
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が1回しか実行されない場合、sys.modules[name]=Const()が発生し、constモジュールがメモリにロードされ、システム辞書にもConstオブジェクトがあり、その後、Constインスタンスを使用できます.
他のファイルで定数値を使用する必要がある場合は、次のように呼び出します.
 
  
from project.apps.project_consts import const
print const.MAIL_PROTO_IMAP