首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python初学者类变量错误

Python初学者类变量错误
EN

Stack Overflow用户
提问于 2015-05-25 19:38:00
回答 3查看 429关注 0票数 9

这是我的第一个问题,很抱歉.一般来说,我是python和编码的初学者,我想创建一个名为“Map”的类,其中包含以下类变量:

代码语言:javascript
复制
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

如果我把变量放在类之外,它就能工作。我做错什么了??

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-25 20:20:05

来自文档

名称指的是对象。名称是通过名称绑定操作引入的。程序文本中的每个名称都是指在包含使用的最内部函数块中建立的名称绑定。 块是作为一个单元执行的Python程序文本的一部分。以下是块:模块、函数体和类定义。交互式键入的每个命令都是一个块。脚本文件(作为解释器的标准输入或指定为解释器的命令行参数的文件)是一个代码块。脚本命令(在解释器命令行上使用‘-c’选项指定的命令)是一个代码块。传递给内置函数eval()和exec()的字符串参数是一个代码块。 在执行帧中执行代码块。框架包含一些管理信息(用于调试),并确定代码块执行完成后在何处以及如何继续执行。 作用域定义块中名称的可见性。如果局部变量是在块中定义的,则其作用域包括该块。如果定义发生在函数块中,则作用域扩展到定义块中包含的任何块,除非包含的块为名称引入不同的绑定。在类块中定义的名称范围仅限于类块;它不扩展到方法的代码块--这包括理解和生成器表达式,因为它们是使用函数作用域实现的。这意味着以下内容将失败:

代码语言:javascript
复制
class A:
    a = 42
    b = list(a + i for i in range(10))

python3中的list comps有自己的作用域,而不是您的代码将按原样工作的python2。

如果使用python2进行下面的示例,您可以看到变量泄漏列表comp的作用域可能会导致一些问题:

代码语言:javascript
复制
class A:
    a = 42
    b = [a for a in range(10)]

a = A()

print(a.a)
9

您有几个选项,可以使用__init__创建实例属性:

代码语言:javascript
复制
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)

使用一种方法:

代码语言:javascript
复制
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())

你的选择实际上取决于你想做什么。

票数 7
EN

Stack Overflow用户

发布于 2015-05-25 20:08:53

您需要使用b.width和b.height来引用成员变量定义。有关访问成员变量- 在Python中访问类的成员变量?的一些说明,请参阅本文。

票数 0
EN

Stack Overflow用户

发布于 2022-01-05 11:10:20

我也是Python的初学者。

使用init()函数定义变量

代码语言:javascript
复制
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初学者教程。他们真的很有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30444962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档