Переменная класса для начинающих Python

Это мой первый вопрос, извините... Я новичок в области Python и кодирования в целом, и я хотел создать класс с именем Map, который бы имел следующие переменные класса:

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

Если я помещу переменные вне класса, это работает. Что я делаю неправильно??

Спасибо за помощь.

3 ответа

Решение

Из документов:

Имена относятся к объектам. Имена вводятся с помощью операций связывания имен. Каждое вхождение имени в тексте программы относится к привязке этого имени, установленной в самом внутреннем функциональном блоке, содержащем использование.

Блок - это фрагмент текста программы Python, который выполняется как единое целое. Ниже приведены блоки: модуль, тело функции и определение класса. Каждая команда, введенная в интерактивном режиме, является блоком. Файл сценария (файл, предоставленный интерпретатору в качестве стандартного ввода или указанный в качестве аргумента командной строки для интерпретатора), является блоком кода. Команда сценария (команда, указанная в командной строке интерпретатора с параметром -c) является блоком кода. Строковый аргумент, передаваемый встроенным функциям eval() и exec(), является блоком кода.

Блок кода выполняется в кадре выполнения. Кадр содержит некоторую административную информацию (используется для отладки) и определяет, где и как продолжается выполнение после завершения выполнения блока кода.

Область действия определяет видимость имени в блоке. Если в блоке определена локальная переменная, ее область действия включает этот блок. Если определение происходит в функциональном блоке, область действия распространяется на любые блоки, содержащиеся в определяющем блоке, если только содержащийся блок не вводит другую привязку для имени. Область имен, определенных в блоке класса, ограничена блоком класса; он не распространяется на блоки кода методов - это включает в себя понимания и выражения генератора, поскольку они реализованы с использованием области действия функции. Это означает, что следующее не удастся:

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

Список comps в python3 имеет свою собственную область, в отличие от python2, где ваш код будет работать как есть.

Если вы возьмете следующий пример с использованием python2, вы увидите, как переменные, выходящие за рамки списка компов, могут вызвать некоторые проблемы:

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

a = A()

print(a.a)
9

У вас есть несколько вариантов, вы можете использовать __init__ создание атрибутов экземпляра:

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)

Используя метод:

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

То, что вы выбираете, действительно зависит от того, что вы хотите сделать.

Вам нужно использовать b.width и b.height для ссылки на переменные-члены, которые определены. Обратитесь к этому посту за разъяснениями о доступе к переменным-членам - Доступ к переменным-членам класса в Python?

Я тоже новичок в Python

используйте функцию init() для определения переменных

      class Map:
    def __init__(self,height,width,top,middle,field):
        self.height = height
        self.width = width
        self.top = top
        self.middle = middle
        self.field = field

Кроме того, посмотрите несколько руководств по ООП Python для начинающих на YouTube. Они действительно помогают

Другие вопросы по тегам