Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t似乎引用了一个实例变量,得到;全局名称。。。“未定义”;_Python_Oop_Instance Variables - Fatal编程技术网

Python Can';t似乎引用了一个实例变量,得到;全局名称。。。“未定义”;

Python Can';t似乎引用了一个实例变量,得到;全局名称。。。“未定义”;,python,oop,instance-variables,Python,Oop,Instance Variables,我写这篇文章是为了使用pygame游戏库创建类似按钮的功能,以学习如何使用Python。在使用函数push() 我真的不明白类中的变量是如何工作的,我假设环境是自动全局的,因为使用了self键盘:它是全局的,因为它是self的成员。然后其他任何东西都只是在局部范围内。我想那是错的。那么,在使用“全局名称”之前,我该如何定义它呢 按钮: class Button(object): def __init__(self,x,y,dimx,dimy,color,phrase):

我写这篇文章是为了使用pygame游戏库创建类似按钮的功能,以学习如何使用Python。在使用函数
push()

我真的不明白类中的变量是如何工作的,我假设环境是自动全局的,因为使用了
self
键盘:它是全局的,因为它是
self
的成员。然后其他任何东西都只是在局部范围内。我想那是错的。那么,在使用“全局名称”之前,我该如何定义它呢

按钮:

class Button(object):

    def __init__(self,x,y,dimx,dimy,color,phrase):
        self.is_clicked = False
        self.has_next = False
        self.next = None
        self.x=x
        self.y=y
        self.dim_x=dimx
        self.dim_y=dimy
        self.e_x=x+dimx
        self.e_y=y+dimy
        self.color=color
        self.color2=color
        self.phrase=phrase

    def mypush(self,btn):
        if not (self.has_next):
            self.next=btn
            self.has_next=True
        else:
            next.mypush(btn)   """ === right here === """

    def checkhit(self,x,y):
         if ((x>= self.x) or (x<=self.e_x)):
             if((y>= self.y) or (y<=self.e_y)):
                 self.is_clicked = True
             self.color = (255,255,255)
                 return self.phrase
         elif (self.has_next == True):
             return self.next.checkhit(x,y)
         else:
             return None

    def release(self):
        if(self.is_clicked == True):
             self.is_clicked=False
         self.color=self.color2
        elif(self.has_next == True):
            self.next.release()

    def mydraw(self,the_game,scrn):
        the_game.draw.rect(scrn,self.color,[self.x, self.y, self.dim_x,self.dim_y])
        if(self.has_next):
            self.next.mydraw(the_game,scrn)
    ...
结果:

Traceback (most recent call last):
  File "testbutton1.py", line 83, in <module>
    my_button.mypush(btn)
  File "testbutton1.py", line 22, in mypush
    next.mypush(btn)
NameError: global name 'next' is not defined
回溯(最近一次呼叫最后一次):
文件“testbutton1.py”,第83行,在
我的按钮。我的按钮(btn)
mypush中第22行的文件“testbutton1.py”
next.mypush(btn)
NameError:未定义全局名称“next”

您需要引用成员变量

self.next.mypush(btn)
next
不是全局变量

self.next.mypush(btn)
next

也。。看看PEP8,你也可以从一开始就养成“pythonic”的习惯,这是我在那里给出的一个有点简洁的答案。让我再详细说明一下。变量在python中解析如下。名称空间是字典。类实例具有可通过self访问的命名空间,例如self.next。类本身具有(静态)类作用域变量,您可以通过classname访问这些变量。然后访问全局命名空间中的变量。查看python内置的globals()和locals(),并尝试在代码中的一些地方添加print(globals())和print(locals())以了解其工作原理。按照python中的约定,类名使用CamelCase,所以按钮。变量使用小写字母,所以我的按钮。使事情更具可读性;我编辑了你的代码。请注意,
self
不是关键字。它只是另一个局部变量,由函数参数设置。您可以随意命名该参数,称之为
self
只是惯例。别搞错了,你真的很想遵守惯例,因为这会让你很快明白这个名字指的是什么,但无论如何,它都不是一个神奇的名字。