Perché non c'è un inizializzatore statico in Python?

0

L'equivalente di

static {
    // Code here
}

non esiste in Python per impostazione predefinita. La cosa più vicina, pur essendo "Pythonic", sembra essere quella di creare un decoratore e fare l'inizializzazione lì come:

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

Creare un nuovo decoratore per ogni classe per fare la stessa cosa non ha senso. Quindi, ho pensato di creare un decoratore standard (ad esempio "initializestatic") e lasciare che quel decoratore chiami un determinato nome di metodo (ad esempio "init_static") come:

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

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

In questo modo, posso sempre usare lo stesso decoratore e ogni volta che ho bisogno di un inizializzatore statico, inserisco il seguente metodo in una classe e inserirò @initializestatic decorator in cima alla classe:

@classmethod
def init_static():
    # Code here

Dato che è così semplice, perché non esiste una soluzione integrata per l'inizializzazione statica in Python? So che questo sembra uno sfogo piuttosto che una domanda, ma sono curioso dei possibili motivi per escludere un inizializzatore statico da Python.

    
posta Utku 18.10.2018 - 02:18
fonte

1 risposta

6

... why isn't there a built-in solution for static initialization in Python?

C'è, hai appena messo roba di inizializzazione statica nella definizione della classe, cioè

>>> 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

Modifica: ho usato la stampa come esempio di un pezzo di codice arbitrario; ecco un altro esempio:

>>> class myclass:
...     val = 42
...     dv = val * 1.2
...     def pr(self):
...             print self.dv
...
>>> m = myclass()
>>> m.pr()
50.4
    
risposta data 18.10.2018 - 02:55
fonte