Python non lascia variabili di classe rientrano in ambito questo modo, ci sono due modi per fare questo, il primo è quello di utilizzare un metodo di classe:
@classmethod
def foo(cls):
print(cls.foo_string)
che vorrei discutere è la soluzione migliore.
Il secondo è quello di accesso per nome:
@staticmethod
def foo():
print(Foo.foo_string)
si noti che, in generale, con una classe come uno spazio dei nomi non è il modo migliore per farlo, è sufficiente utilizzare un modulo con funzioni di primo livello invece, come questo agisce più come vuoi.
Il motivo della mancanza di scoping come questo è principalmente dovuto alla natura dinamica di Python, come funzionerebbe quando si inserisce una funzione nella classe? Dovrebbe avere un comportamento speciale aggiunto ad esso condizionatamente, il che sarebbe estremamente difficile da implementare e potenzialmente fragile. Aiuta anche a mantenere le cose esplicite piuttosto che implicite - è chiaro che cos'è una variabile di classe rispetto a una variabile locale.
fonte
2012-10-23 19:07:43
+1 per l'utilizzo di un modulo come spazio dei nomi. –
Nella compilazione di classe 3.x, qualsiasi funzione che fa riferimento a '__class__' diventa una chiusura. La cella per '__class__' è impostata dalla nuova funzione incorporata' __build_class__'. 'staticmethod' viene rimosso da 3.x, quindi una semplice funzione definita in una classe può fare riferimento a' __class__'. – eryksun
@DanielRoseman La ragione principale per cui non sto usando un modulo come spazio dei nomi è che ho classi annidate per spazi dei nomi annidati, ed è ingombrante gestire così tanti piccoli file. – Lucretiel