web-dev-qa-db-ja.com

Pythonに静的初期化子がないのはなぜですか?

同等のもの

static {
    // Code here
}

Pythonにはデフォルトでは存在しません。 "Pythonic"である間、最も近いのは デコレータを作成する であり、次のように初期化を行うようです。

def static_initialization_decorator_for_myclass(cls):
    cls.initialize_static_stuff()
    return cls

@static_initialization_decorator_for_myclass
class MyClass:
    @classmethod
    def initialize_static_stuff():
        # Code here

同じことを行うために各クラスに新しいデコレータを作成しても意味がありません。したがって、私は標準のデコレータ(たとえば「initializestatic」)を作成し、そのデコレータに特定のメソッド名(たとえば「init_static」)を呼び出させることを考えました。

def initializestatic(cls):
    cls.init_static()
    return cls

@initializestatic
class MyClass:
    @classmethod
    def init_static():
        # Code here

このように、常に同じデコレータを使用でき、静的初期化子が必要な場合はいつでも、次のメソッドをクラスに配置して@initializestaticクラスの上のデコレータ:

@classmethod
def init_static():
    # Code here

それが単純であるとすれば、なぜPythonに静的な初期化のための組み込みのソリューションがないのですか?これは質問というよりは暴言のように聞こえることは知っていますが、Pythonから静的初期化子を除外するための考えられる動機に興味があります。

2
Utku

...なぜPythonには静的初期化の組み込みソリューションがないのですか?

そこには、静的な初期化の要素をクラス定義に配置するだけです。

>>> class myclass:
...     print "anything in the class definition will be executed once!"
...     val = 42
...     def __init__(self,v):
...             self.v = v
...     def pr(self):
...             print self.v, self.val, myclass.val
...     def set(self,v):
...             self.val = v
...     def clsset(self, v):
...             myclass.val = v
...
anything in the class definition will be executed once!
>>> m = myclass(1)
>>> m.pr()
1 42 42
>>> m.set(2)
>>> m.clsset(24)
>>> m.pr()
1 2 24
>>> mm = myclass(2)
>>> mm.pr()
2 24 24
>>> mm.set(42)
>>> mm.pr()
2 42 24

編集:私は任意のコードの例として印刷を使用しました。ここに別の例があります:

>>> class myclass:
...     val = 42
...     dv = val * 1.2
...     def pr(self):
...             print self.dv
...
>>> m = myclass()
>>> m.pr()
50.4
8
esoterik