Передача переменной из одного экземпляра класса в другой с использованием Python?
У меня проблемы с передачей переменной, определенной в одном экземпляре класса, в другой экземпляр класса. Я относительно новичок в использовании классов, но, насколько я понимаю, переменные можно передавать из одного экземпляра в другой, просто определяя их как часть экземпляра класса (например, в следующем примере). Несмотря на то, что я использовал эту модель в прошлом, я никогда не пытался сделать это, используя графический интерфейс, такой как wxPython .
class Foo(object): def __init__(self, var): self.var = var class Bar(object): def do_something(self, var): print var*3 if __name__ == '__main__': f = Foo(3) b = Bar() b.do_something(f.var)
У меня проблема в том, что экземпляр wxPython предопределен и не принимает никаких дополнительных параметров (что позволяет мне передавать только такие вещи, как title, size и т. Д.) В экземпляр класса.
Другая проблема, с которой я сталкиваюсь, это то, что я пытаюсь передать переменную на три класса глубже, вызывая диалоговое окно, и из диалога я вызываю отдельный класс, предназначенный для запуска рабочего потока.
- Как передать переменную из экземпляра первого класса в экземпляр третьего класса?
- Как я могу переопределить экземпляр wxPython для определения дополнительных переменных?
- ИЛИ Можно ли создать собственный обработчик событий для передачи необходимых данных?
Я использую Python и хотел бы думать, что я понимаю основы программирования с использованием Classes и GUI с такими фреймворками, как Tkinter и wxPython (используется в этом проекте). Я написал основной класс / экземпляр, который получает некоторые данные от пользователя, и я хотел бы иметь возможность передавать информацию, хранящуюся в self.main_instance_var, и передавать ее во второй класс / экземпляр (в данном случае диалоговое окно Progress Dialog звонили из первого класса.
Когда я попытался использовать вышеупомянутую модель в моем диалоге прогресса, я получил очень неинформативную синтаксическую ошибку («не ключевое слово arg после ключевого слова arg»). Предотвращение дальнейшей передачи переменной из диалогового окна Progress в рабочий поток. Если бы я получил исключение, это было бы одно, но синтаксическая ошибка, я не понимаю. Посмотрите ниже для краткого примера:
class ProgressDialog(wx.Dialog): def __init__(self, parent, title, myVar): # Generates syntax error on this line super(ProgressDialog, self).__init__(parent=parent, title=title, size=(500, 110)) self.var = myVar
Основной источник (по запросу, извините, он такой грязный):
import time import os, sys, wx from ftplib import FTP_TLS from threading import Thread from wx.lib.pubsub import Publisher ######################################################################## class FtpValues(object): """ Returns a property attribute - called by FtpFileTransfer Used to set values/variables for Host, USERID, PASSWD, FILE """ #---------------------------------------------------------------------- def __init__(self): self.varList = None #---------------------------------------------------------------------- def GetValues(self): return self.varList #---------------------------------------------------------------------- def SetValues(self, HOST, USERID, PASSWD, FILE): self.varList = [HOST, USERID, PASSWD, FILE] #---------------------------------------------------------------------- def DelValues(self): del self.valList Values = property(GetValues, SetValues, DelValues, "Set/Get FtpValues") # http://docs.python.org/library/functions.html#property ######################################################################## class FtpFileTransfer(Thread): """Test Worker Thread Class.""" #---------------------------------------------------------------------- def __init__(self): """Init Worker Thread Class.""" Thread.__init__(self) self.StartTransfer() # start the thread #---------------------------------------------------------------------- def StartTransfer(self): # was named run - started automatically """Run Worker Thread.""" # when called by the start method # This is the code executing in the new thread. HOST, USERID, PASSWD, FILE = FtpValues.Values BLOCKSIZE = 57344 try: ftp = FTP_TLS(HOST) ftp.login(USERID, PASSWD) ftp.prot_p() ftp.voidcmd("TYPE I") f = open(FILE, 'rb') datasock, esize = ftp.ntransfercmd( 'STOR %s' % os.path.basename(FILE)) size = os.stat(FILE)[6] bytes_so_far = 0 while 1: buf = f.read(BLOCKSIZE) if not buf: break datasock.sendall(buf) bytes_so_far += len(buf) msg = [bytes_so_far, size] Publisher().sendMessage("update", msg) except: raise finally: try: datasock.close() f.close() ftp.voidresp() ftp.quit() print 'Complete. ' except: pass wx.CallAfter(Publisher().sendMessage, "update", "Database Transfer Complete!") ######################################################################## class ProgressDialog(wx.Dialog): def __init__(self, parent, title): super(ProgressDialog, self).__init__(parent=parent, title=title, size=(500, 110)) self.displayLbl = wx.StaticText(self, -1, 'Verifying Database Files. ', (20, 20)) #Preparing for Transfer. self.gauge = wx.Gauge(self, -1, 100, (20, 45), (370, 24)) self.btn = btn = wx.Button(self, -1, 'Cancel', (400, 45), (-1, 25)) btn.Bind(wx.EVT_BUTTON, self.OnClose) # listens for response from worker thread Publisher().subscribe(self.updateDisplay, "update") FtpFileTransfer()#.StartTransfer(HOST, USERID, PASSWD, FILE) #Start the FTP Worker Thread #self.OnStart() #---------------------------------------------------------------------- def run(self): FtpFileTransfer(HOST, USERID, PASSWD, FILE) #---------------------------------------------------------------------- def OnClose(self, event): """ Place Holder """ if self.btn.GetLabel() == 'Finish': # Do Something! pass return None #---------------------------------------------------------------------- def updateDisplay(self, msg): """ Receives data from thread and updates the display """ if isinstance(msg.data, list): bytes_so_far, size = msg.data k = 100 * bytes_so_far / size self.displayLbl.SetLabel("Sent %d of %d bytes %.1f%%" % (bytes_so_far, size, 100 * bytes_so_far / size)) self.gauge.SetValue(k) else: self.displayLbl.SetLabel("%s" % msg.data) #self.btn.Enable() self.btn.SetLabel('Finish') ######################################################################## class MyForm(wx.Frame): #---------------------------------------------------------------------- def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial") # Add a panel so it looks the correct on all platforms panel = wx.Panel(self, wx.ID_ANY) self.displayLbl = wx.StaticText(panel, label="Amount of time since thread started goes here") self.btn = btn = wx.Button(panel, label="Start Thread") self.gauge = wx.Gauge(panel, -1, 100, size=(370, 24)) btn.Bind(wx.EVT_BUTTON, self.onButton) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.displayLbl, 0, wx.ALL|wx.CENTER, 5) sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) sizer.Add(self.gauge, 0, wx.ALL|wx.CENTER, 5) panel.SetSizer(sizer) self.VarData() # create a pubsub receiver Publisher().subscribe(self.updateDisplay, "update") #---------------------------------------------------------------------- def onButton(self, event): """ Runs the thread """ chgdep = ProgressDialog(None, title='File Transfer. . .') chgdep.ShowModal() #chgdep.Destroy() #---------------------------------------------------------------------- def updateDisplay(self, msg): """ Receives data from thread and updates the display """ if isinstance(msg.data, list): bytes_so_far, size = msg.data k = 100 * bytes_so_far / size self.displayLbl.SetLabel("Sent %d of %d bytes %.1f%%" % (bytes_so_far, size, 100 * bytes_so_far / size)) self.gauge.SetValue(k) else: self.displayLbl.SetLabel("%s" % msg.data) self.btn.Enable() #---------------------------------------------------------------------- def VarData(self): HOST = '127.0.0.1' USERID = 'test' PASSWD = 'P@ssw0rd' FILE = r'F:\Programming\temp\Test.zip' varList = [HOST, USERID, PASSWD, FILE] FtpValues.Values = HOST, USERID, PASSWD, FILE #---------------------------------------------------------------------- # Run the program if __name__ == "__main__": app = wx.PySimpleApp() frame = MyForm().Show() app.MainLoop()
Как правильно обращаться к переменной класса из другого класса?
Доброго времени суток!
Примерно с 2 недели назад начал изучать Python, до этого был не большой опыт программирования. Получил интересное задание от товарища, вопрос будет как раз по нему (введение дабы сразу не кидались палками 🙂 )
Вопрос состоит в следующем:
Как мне обратиться к двум переменным, а именно twist_num и choice_num (сравнение для дальнейшей работы с балансом)?
Пробовал через сеттер, ничего не вышло, в коде ниже попытался задействовать прямое обращение.
Вроде как сама IDE обращение видит и понимание, но при дальнейшей проверки кода в консоли = ноль реакции..
from random import randint class Balance(object): def __init__(self): self.money() self.input_bet() def run(self): self.input_bet = None def input_bet(self): input_bet = input('Ваша ставка: \n') try: input_bet = int(input_bet) self.input_bet = input_bet except Exception: print('Не число') def money(self) -> None: money = 10000 print("Ваш баланс:" + str(money)) #---------------------------------------------------------------------------------------- class Roulette(object): def __init__(self): self.__choice_num = None self.__twist_num = None def run(self): while True: self.input_number() self.twist_roulette() self.check_choice_num() def input_number(self) -> None: is_num = False while not is_num: number = input('Введите целое число от 0 до 36 \n') try: number = int(number) is_num = True self.choice_num = number except Exception: print('Опаньки. Что-то ты сделал не так. \n') def twist_roulette(self) -> None: self.twist_num = randint(0,1) def check_choice_num(self) -> None: if self.choice_num == self.twist_num: print('Ты победил: выпало число ' + str(self.twist_num)) return print('Ты проиграл: выпало число ' + str(self.twist_num)) #---------------------------------------------------------------------------------------- class Game: def __init__(self): self.roulette = Roulette() self.balance = Balance() def run(self): self.game_lose() self.game_won() def game_won(self): if roulette.choice_num == roulette.twist_num: print('You won!') balance = Balance() balance.run() roulette = Roulette() roulette.run() game = Game() game.run()
Простой 2 комментария