класс del с wxpython внутри условного работает неожиданно

Я пытаюсь удалить экземпляр класса, когда условие выполнено. Но у меня проблемы, потому что он удаляется до того, как войдет в состояние. Я не знаю, что происходит... В коде используется wxpython с некоторыми кнопками для удаления элементов, поэтому я правильно создаю кнопки при инициализации, но когда я пытаюсь удалить элемент, прежде чем он достигает первого условного выражения, кажется, быть удалено условным выражением 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()

person Ruben Medrano    schedule 17.04.2016    source источник


Ответы (1)


Вы пропускаете какой-то соответствующий код, потому что этот код:

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 локальных имен (если только вы не объявите T глобальной внутри dostuff() ). В результате python не будет искать значение T за пределами функции dostuff().

Поэтому другим решением (не рекомендуется) было бы сделать это:

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__(). Обычно считается ужасным проектом программы иметь функции внутри класса, управляющие глобальными переменными.

person 7stud    schedule 17.04.2016
comment
Спасибо, 7stud. Кажется, ошибка связана с ссылкой, которую вы публикуете ... Но в любом случае я обновил код, так что теперь он не работает. - person Ruben Medrano; 17.04.2016
comment
Большое спасибо 7stud! Он работает идеально! ... Я отредактировал и опубликовал новый рабочий код, - person Ruben Medrano; 17.04.2016
comment
@RubenMedrano, в вашем посте я прочитал: Но если я удалю последнюю строку del(T), это не даст никакой ошибки., что опровергает все, что, как я утверждал, происходило. Если хотите посмотреть, я изменил свое объяснение. - person 7stud; 17.04.2016
comment
7stud, я вижу, вы изменили его. Теперь это более ясно. В любом случае, я должен был опубликовать полный код в качестве первого поста. Спасибо за ваше объяснение и за ваше время! ........ Теперь я должен научиться передавать экземпляр между классами, потому что мне это понадобится для моей программы :) - person Ruben Medrano; 17.04.2016