Variable de clase principiante de Python Error

esta es mi primera pregunta, lo siento … Soy un principiante con python y encoding en general, y quería crear una clase llamada ‘Mapa’ que tendría las siguientes variables de clase:

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 

Si pongo las variables fuera de la clase funciona. ¿¿Qué estoy haciendo mal??

Gracias por la ayuda.

De los documentos :

Los nombres se refieren a objetos. Los nombres se introducen mediante operaciones de enlace de nombres. Cada aparición de un nombre en el texto del progtwig se refiere al enlace de ese nombre establecido en el bloque de función más interno que contiene el uso.

Un bloque es una parte del texto del progtwig Python que se ejecuta como una unidad. Los siguientes son bloques: un módulo, un cuerpo de función y una definición de clase. Cada comando escrito de forma interactiva es un bloque. Un archivo de script (un archivo dado como entrada estándar al intérprete o especificado como un argumento de línea de comandos al intérprete) es un bloque de código. Un comando de script (un comando especificado en la línea de comandos del intérprete con la opción ‘-c’) es un bloque de código. El argumento de cadena pasado a las funciones incorporadas eval () y exec () es un bloque de código.

Un bloque de código se ejecuta en un marco de ejecución. Una ttwig contiene cierta información administrativa (utilizada para la depuración) y determina dónde y cómo continúa la ejecución después de que se haya completado la ejecución del bloque de código.

Un ámbito define la visibilidad de un nombre dentro de un bloque. Si se define una variable local en un bloque, su scope incluye ese bloque. Si la definición se produce en un bloque de funciones, el scope se extiende a cualquier bloque contenido dentro del que define, a menos que un bloque contenido introduzca un enlace diferente para el nombre. El scope de los nombres definidos en un bloque de clase se limita al bloque de clase; no se extiende a los bloques de código de los métodos; esto incluye comprensiones y expresiones generadoras, ya que se implementan utilizando un ámbito de función . Esto significa que lo siguiente fallará:

 class A: a = 42 b = list(a + i for i in range(10)) 

Los comps de lista en python3 tienen su propio scope, a diferencia de python2 donde su código funcionaría como es.

Si toma el siguiente ejemplo usando python2, puede ver cómo las variables que pierden el scope de la lista comp pueden causar algunos problemas:

 class A: a = 42 b = [a for a in range(10)] a = A() print(aa) 9 

Tiene algunas opciones, podría usar __init__ creando atributos de instancia:

 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) 

Utilizando un método:

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

Lo que elija dependerá realmente de lo que quiera hacer.

debe usar b.width y b.height para referirse a las variables miembro definidas. Consulte esta publicación para obtener una explicación sobre cómo acceder a las variables miembro. ¿ Acceder a las variables miembro de una clase en Python?