2015-05-25 25 views
7

questa è la mia prima domanda, mi dispiace ... Sono un principiante con Python e la codifica in generale, e volevo creare una classe chiamata 'Mappa' che avrebbe le seguenti variabili di classe :Python beginner Classe variabile Errore

class Map: 
    height = 11 
    width = 21 

    top = [['#']*width] 
    middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)] 
    field = top + middle + top 

b = Map() 

Shell: 
>>> middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)] 
    NameError: name 'width' is not defined 

Se metto le variabili fuori dalla classe funziona. Cosa sto facendo male ??

Grazie per l'aiuto.

+2

Hai seguito il [tutorial delle classi] (https://docs.python.org/2/tutorial/classes.html)? – bereal

+0

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

+1

Funziona anche per me – Ladmerc

risposta

7

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.

+0

Quindi ... la funzione di ciclo "for" all'interno dell'elenco non ha accesso alla variabile di larghezza? – Cookiesforhelp

+0

@Cookiesforhelp, sì, esattamente –

+0

Grazie per il vostro tempo e i collegamenti ma, un'ultima domanda nell'esempio python2 la variabile perde "dati byte" per diventare un altro numero perché è strano – Cookiesforhelp

0

è necessario utilizzare b.width e b.height per definire le variabili membro definite. consultare questo post per qualche spiegazione su come accedere alle variabili membro - Accessing a class' member variables in Python?

+0

Questo è sbagliato e non è effettivamente correlato al problema, l'errore si verifica sempre prima che l'istanza venga creata –