Dal docs:
nomi si riferiscono a oggetti. I nomi vengono introdotti dalle operazioni di associazione dei nomi. Ogni occorrenza di un nome nel testo del programma si riferisce al legame di quel nome stabilito nel blocco funzione più interno che contiene l'uso.
Un blocco è un pezzo di testo del programma Python che viene eseguito come un'unità. I seguenti sono blocchi: un modulo, un corpo di una funzione e una definizione di classe. Ogni comando digitato interattivamente è un blocco. Un file di script (un file dato come input standard all'interprete o specificato come argomento da riga di comando all'interprete) è un blocco di codice. Un comando di script (un comando specificato sulla riga di comando dell'interprete con l'opzione '-c') è un blocco di codice. L'argomento stringa passato alle funzioni built-in eval() ed exec() è un blocco di codice.
Un blocco di codice viene eseguito in un frame di esecuzione. Un frame contiene alcune informazioni amministrative (utilizzate per il debug) e determina dove e come l'esecuzione continua dopo che l'esecuzione del blocco di codice è stata completata.
Un ambito definisce la visibilità di un nome all'interno di un blocco. Se una variabile locale è definita in un blocco, il suo ambito include quel blocco. Se la definizione si verifica in un blocco funzione, l'ambito si estende a qualsiasi blocco contenuto all'interno di quello definitivo, a meno che un blocco contenuto non presenti un legame diverso per il nome. L'ambito dei nomi definiti in un blocco di classe è limitato al blocco di classe; non si estende ai blocchi di codice dei metodi - questo include le comprensioni e le espressioni del generatore poiché sono implementati usando uno scope di funzione. Ciò significa che il seguente fallirà:
class A:
a = 42
b = list(a + i for i in range(10))
lista composizioni in python3 hanno il loro campo di applicazione, al contrario di python2 dove il codice avrebbe funzionato come è.
Se si prende il seguente esempio utilizzando python2, si può vedere come le variabili che perde la portata della lista comp potrebbero causare alcuni problemi:
class A:
a = 42
b = [a for a in range(10)]
a = A()
print(a.a)
9
avete alcune opzioni, è possibile utilizzare __init__
creando attributi di istanza :
class Map:
def __init__(self):
self.height = 11
self.width = 21
self.top = [['#']*self.width]
self.middle = [['#']+[' ']*(self.width-2)+['#'] for i in range(self.height-2)]
self.field = self.top + self.middle + self.top
m=Map()
print(m.field)
Utilizzando un metodo:
class Map:
@staticmethod
def meth():
height = 11
width = 21
top = [['#']*width]
middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)]
field = top + middle + top
return field
b = Map()
print(b.meth())
Ciò che si sceglie dipende in realtà da ciò che si vuole fare.
Hai seguito il [tutorial delle classi] (https://docs.python.org/2/tutorial/classes.html)? – bereal
b.width? b.height? Poiché sei fuori dalla classe, la mappa. Vedi questo post che ti aiuterà a capire meglio: http://stackoverflow.com/questions/68645/static-class-variables-in-python – Alex
Funziona anche per me – Ladmerc