Pythonでは、シングルトンパターンを実装する方法はメタクラスを使用することです。
class Singleton(type):
def __init__(cls, name, bases, dict):
super(Singleton, cls).__init__(name, bases, dict)
cls.INSTANCE = None
def __call__(cls, *args, **kwargs):
if cls.INSTANCE is None:
cls.INSTANCE = super(Singleton, cls).__call__(*args, **kwargs)
return cls.INSTANCE
しかし、EclipseでPyDev dictパラメーターを使用すると、警告が発生しますAssignment to reserved built-in symbol: dict
。
また、PEP8は次のように述べています。
関数の引数の名前が予約済みのキーワードと衝突する場合は、一般に、省略形やスペルの誤りを使用するよりも、末尾に1つのアンダースコアを追加することをお勧めします。したがって、class_はclssよりも優れています。(おそらく、同義語を使用してそのような衝突を回避する方が良いでしょう。)
辞書、classdict、attrsなど、dictの代わりにパラメーターに割り当てられたさまざまな名前をWebで見つけました。
そして、*argsと**kwargsを使用したアプローチ:
class Singleton(type):
def __init__(cls, *args, **kwargs):
super(Singleton, cls).__init__(*args, **kwargs)
cls.INSTANCE = None
def __call__(cls, *args, **kwargs):
if cls.INSTANCE is None:
cls.INSTANCE = super(Singleton, cls).__call__(*args, **kwargs)
return cls.INSTANCE
タイプinitメソッドが署名を変更しても安全なので、この最後のスニペットが最適だと思います。
質問:
dictの代わりにどのような名前をパラメータに割り当てますか?
この最後のスニペットについてどう思いますか?
最良の選択肢は何だと思いますか?パラメータ名を変更するか、*argsと**kwargsを使用しますか?