0

当条件完成时,我试图删除一个类的实例。但是我遇到了问题,因为它在进入条件之前就被删除了。我不知道发生了什么......代码使用 wxpython 和一些按钮来删除项目,所以我在 init 上正确构建了按钮但是当我尝试删除一个项目时,在它达到第一个条件之前,它似乎被 las 有条件的删除,以前不应该这样做。所以我不知道问题出在哪里......当我第一次按下按钮“deleteitem”时出现的错误是:

'分配前引用的局部变量'T''(在第6行:...如果T.items> 0 :)

但是如果我删除最后一行 del(T) 它不会给出任何错误。

这是基本代码:

class Test(object):
    def __init__(self):
        self.items=8

T=Test()



if button.GetName()=='deleteitem': 
    if T.items>0:
        T.items-=1
        if T.items<0:
            del(T)

编辑:

好的,因为我首先发布的示例可以工作,这里是不起作用的代码:

import wx

class Test(object):
    def __init__(self):
        self.items=8

T=Test()

class MyFrame(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,
                          pos=(150, 150), size=(350, 200))

        self.btn = wx.Button(self, -1, "Press to delete Item, current Items: "+str(T.items))
        self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn)


    def OnButton(self, evt):
        print 'Current Items: '+str(T.items)
        self.btn.SetLabel('Press to delete Item, current Items: '+str(T.items))
        if T.items>0:
            T.items-=1
            if T.items==0:
                del(T)


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, "Simple wxPython App")
        frame.Show(True)
        return True

app = MyApp()
app.MainLoop()

最终工作代码:

import wx

class Test(object):
    def __init__(self):
        self.items=8

class MyFrame(wx.Frame):

    def __init__(self, parent, title):
        self.T=Test()
        wx.Frame.__init__(self, parent, -1, title,
                          pos=(150, 150), size=(350, 200))

        self.btn = wx.Button(self, -1, "Press to delete Item, current Items: "+str(self.T.items))
        self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn)


    def OnButton(self, evt):
        if self.T.items>0:
            self.T.items-=1
            if self.T.items==0:
                del(self.T)
                self.btn.SetLabel('Deleted instance T')
            else:
                self.btn.SetLabel('Press to delete Item, current Items: '+str(self.T.items))
                print 'current Items: '+str(self.T.items)

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, "Simple wxPython App")
        frame.Show(True)
        return True

app = MyApp()
app.MainLoop()
4

1 回答 1

0

您遗漏了一些相关代码,因为此代码:

class Test(object):
    def __init__(self):
        self.items=8

T=Test()



if True: 
    if T.items>0:
        T.items-=1
        if T.items<0:
            del(T)

执行没有错误。

无论如何,听起来您的代码是嵌套函数中变量范围的一些变体。

对新代码的响应:

据我所知,del本地化一个变量:

示例 1:

class Test(object):
    def __init__(self):
        self.items=8

T = Test()

class Dog(object):
    def dostuff(self):
        print 'executing dostuff()'
        if T.items > 10:  #This will never be True
            T

Dog().dostuff()

--output:--
executing dostuff()

示例 2:

class Test(object):
    def __init__(self):
        self.items=8

T = Test()

class Dog(object):
    def dostuff(self):
        print 'executing dostuff()'
        if T.items > 10:  #This will never be True
            del T


Dog().dostuff()

--output:--
executing dostuff()
Traceback (most recent call last):
  File "1.py", line 14, in <module>
    Dog().dostuff()
  File "1.py", line 10, in dostuff
    if T.items > 10:
UnboundLocalError: local variable 'T' referenced before assignment

所以看起来解析器将 T 标记为 dostuff() 函数中的局部变量——因为你只能使用del局部名称(除非你在 dostuff() 中声明 T 是全局的)。因此,python 不会在 dostuff() 函数之外寻找 T 的值。

因此,另一种解决方案(不推荐)是这样做:

class Test(object):
    def __init__(self):
        self.items=8

T = Test()

class Dog(object):
    def dostuff(self):
        global T  #<===HERE
        print 'executing dostuff()'

        if T.items > 10:
            del T


Dog().dostuff()

--output:--
executing dostuff()

为了解决您的问题,我将在您的__init__()函数末尾添加以下内容:

self.T = Test()

或者,您可以将 T 作为参数传递给__init__(). 通常认为在类中具有操作全局变量的函数是糟糕的程序设计。

于 2016-04-17T09:30:30.647 回答