这是我的第一个问题,很抱歉.一般来说,我是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如果我把变量放在类之外,它就能工作。我做错什么了??
谢谢你的帮助。
发布于 2015-05-25 20:20:05
来自文档
名称指的是对象。名称是通过名称绑定操作引入的。程序文本中的每个名称都是指在包含使用的最内部函数块中建立的名称绑定。 块是作为一个单元执行的Python程序文本的一部分。以下是块:模块、函数体和类定义。交互式键入的每个命令都是一个块。脚本文件(作为解释器的标准输入或指定为解释器的命令行参数的文件)是一个代码块。脚本命令(在解释器命令行上使用‘-c’选项指定的命令)是一个代码块。传递给内置函数eval()和exec()的字符串参数是一个代码块。 在执行帧中执行代码块。框架包含一些管理信息(用于调试),并确定代码块执行完成后在何处以及如何继续执行。 作用域定义块中名称的可见性。如果局部变量是在块中定义的,则其作用域包括该块。如果定义发生在函数块中,则作用域扩展到定义块中包含的任何块,除非包含的块为名称引入不同的绑定。在类块中定义的名称范围仅限于类块;它不扩展到方法的代码块--这包括理解和生成器表达式,因为它们是使用函数作用域实现的。这意味着以下内容将失败:
class A:
a = 42
b = list(a + i for i in range(10))python3中的list comps有自己的作用域,而不是您的代码将按原样工作的python2。
如果使用python2进行下面的示例,您可以看到变量泄漏列表comp的作用域可能会导致一些问题:
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())你的选择实际上取决于你想做什么。
发布于 2015-05-25 20:08:53
您需要使用b.width和b.height来引用成员变量定义。有关访问成员变量- 在Python中访问类的成员变量?的一些说明,请参阅本文。
发布于 2022-01-05 11:10:20
我也是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另外,还可以看一些关于YouTube的OOP Python初学者教程。他们真的很有帮助
https://stackoverflow.com/questions/30444962
复制相似问题