0

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メソッドが署名を変更しても安全なので、この最後のスニペットが最適だと思います。

質問:

  1. dictの代わりにどのような名前をパラメータに割り当てますか?

  2. この最後のスニペットについてどう思いますか?

  3. 最良の選択肢は何だと思いますか?パラメータ名を変更するか、*argsと**kwargsを使用しますか?

4

1 に答える 1

0
  1. dictは組み込み型で、代わりにまたはnamespaceを使用できます。attributesここではそれほど重要ではありません。ローカル変数名にすぎません。

    位置パラメータであるため、特定の名前を付ける必要はありません。データモデルのドキュメントでは。を使用していnamespaceます。

  2. を使用し*argsて、**kwargsそこでは大丈夫です。実際、__init__()メタクラスのには追加のキーワード引数を渡すことができるため、それらをスーパー__init__メソッドに渡すことをお勧めします。

  3. パラメータを気にしないときに使用*argsします。**kwargsそうすれば、メソッドの将来を保証できます。

super()Python 3では、引数を指定する必要がなくなったことに注意してください。

class Singleton(type):
    def __init__(cls, *args, **kwargs):
        super().__init__(*args, **kwargs)
        cls.INSTANCE = None

    def __call__(cls, *args, **kwargs):
        if cls.INSTANCE is None:
            cls.INSTANCE = super().__call__(*args, **kwargs)
        return cls.INSTANCE
于 2013-03-25T17:41:14.117 に答える