Переменная класса для начинающих 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. Они действительно помогают