Как передать переменную из одного класса в другой и занести ее в бд, не изменяя остальное в бд?
я пишу программу на питоне с помощью QtDesignera. так вот, у меня появляется окно, в котором пользователь(в самом начале он регистрируется или входит, если уже зарегистрировался. при этом в базе данных сохраняется его пароль, имя и результат = 0) за определенное время должен ввести ответы на математические примеры и нажать кнопку Okey, после чего в новом окно должны появиться «Поздравляю! ваш результат:» и количество правильно решенных задач. но результат, в котором считается правильные ответы реализуется в одном классе, а окно вывода — в другом. как записать его количество верных ответов в бд, а потом вывести их.
class Test(QMainWindow): def __init__(self): super().__init__() uic.loadUi('test.ui', self) self.checkBut.clicked.connect(self.result) def answers(self): self.answers = [self.answer_1.text(), self.answer_2.text(), self.answer_3.text(), self.answer_4.text(), self.answer_5.text(), self.answer_6.text(), self.answer_7.text(), self.answer_8.text(), self.answer_9.text(), self.answer_10.text(), self.answer_11.text(), self.answer_12.text(), self.answer_13.text(), self.answer_14.text(), self.answer_15.text(), self.answer_16.text(), self.answer_17.text(), self.answer_18.text(), self.answer_19.text(), self.answer_20.text(), self.answer_21.text(), self.answer_22.text(), self.answer_23.text(), self.answer_24.text(), self.answer_25.text(), self.answer_26.text(), self.answer_27.text(), self.answer_28.text(), self.answer_29.text(), self.answer_30.text(),] self.right = [32, 7, 14, 427, 68, 56, 3, 432, 18, 7, 712, 7, 98, 28, 783, 9, 354, 35, 9, 49, 127, 387, 8, 36, 72, 206, 6, 315, 226, 42] global right_answers right_answers = 0 for i in range(0, 30): if int(self.answer[i]) == int(self.right[i]): right_answer += 1 def add_result(self, result): self.result = result def result(self): self.check = True self.result.show() self.close() class Result(QMainWindow): def __init__(self): super().__init__() uic.loadUi('result.ui', self) def add_rating(self, rating): self.rating = rating def right_ans(self, right_answers): self.result_test.setText(self.right_answers)
- Вопрос задан более двух лет назад
- 268 просмотров
Переменные класса и экземпляра в Python
В этой статье мы расскажем про переменные класса и экземпляра в Python. Мы разберем, чем они отличаются и как с ними работать.
Объектно-ориентированное программирование позволяет использовать переменные на уровне класса или на уровне экземпляра класса. Переменные – это, по сути, символы, заменяющие значение, которое вы используете в программе.
На уровне класса переменные называются переменными класса, на уровне экземпляра – переменными экземпляра.
Когда мы ожидаем, что переменные будут общими для всех экземпляров класса или когда мы хотим инициализировать переменную, мы можем определить эту переменную на уровне класса. Если же мы ожидаем, что переменные будут значительно отличаться в разных экземплярах, мы можем определить их на уровне экземпляра класса.
Одним из принципов разработки программного обеспечения является принцип DRY (Don’t repeat yourself), который означает «Не повторяйся». Этот принцип направлен на ограничение повторов (дублирования) в коде. Объектно-ориентированное программирование придерживается принципа DRY, поскольку он снижает избыточность.
Для начала
У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере, подходящая для вашей операционной системы (Ubuntu, CentOS, Debian и т.д.)
Переменные класса в Python
Переменные класса определяются в конструкторе класса. Поскольку они принадлежат самому классу, переменные класса разделяются всеми экземплярами класса. Поэтому они, как правило, будут иметь одинаковое значение для каждого экземпляра. Исключение — если вы используете переменную класса для инициализации переменной.
Переменные класса определяются вне всех методов. Обычно они размещаются прямо под заголовком класса, перед методом конструктора и другими методами.
Примечание. Чтобы следовать примерам кода в этом руководстве, откройте интерактивную оболочку Python в своей локальной системе, выполнив команду python3 . Затем вы можете копировать, вставлять или редактировать примеры, добавляя код после символов >>> .
Сама по себе переменная класса выглядит следующим образом:
class Shark: animal_type = "fish"
Здесь переменной animal_type присвоено значение «fish» .
Мы можем создать экземпляр класса Shark (назовем его new_shark ) и вывести переменную, используя точечную нотацию:
class Shark: animal_type = "fish" new_shark = Shark() print(new_shark.animal_type)
Запустим нашу программу:
И получим следующий результат:
Программа возвращает значение нашей переменной.
Теперь давайте добавим ещё несколько переменных класса и выведем их:
class Shark: animal_type = "fish" location = "ocean" followers = 5 new_shark = Shark() print(new_shark.animal_type) print(new_shark.location) print(new_shark.followers)
Как и любая другая переменная, переменные класса могут содержать данные любого типа (из доступных в Python). В этой программе есть строки ( animal_type и location ) и целое число ( followers ). Давайте снова запустим программу с помощью команды python shark.py и просмотрим на результат:
# Output fish ocean 5
Экземпляр new_shark имеет доступ ко всем переменным класса и может выводить их при запуске программы.
Переменные класса позволяют нам определять переменные при построении класса. Затем эти переменные и связанные с ними значения становятся доступными для каждого экземпляра класса.
Переменные экземпляра класса в Python
Переменные экземпляра принадлежат экземплярам класса. Это означает, что для каждого объекта или экземпляра класса переменные экземпляра различны.
В отличие от переменных класса, переменные экземпляра определяются внутри методов.
Например, в приведенном ниже коде переменные класса Shark name и age являются переменными экземпляра:
class Shark: def __init__(self, name, age): self.name = name self.age = age
При создании объекта класса Shark нам нужно определить эти переменные, которые передаются как параметры в методе конструктора или другом методе.
class Shark: def __init__(self, name, age): self.name = name self.age = age new_shark = Shark("Sammy", 5)
Так же, как и в случае с переменными класса, мы можем вывести переменные экземпляра в консоль:
class Shark: def __init__(self, name, age): self.name = name self.age = age new_shark = Shark("Sammy", 5) print(new_shark.name) print(new_shark.age)
Когда мы запустим указанную выше программу, используя python shark.py , мы получим следующий вывод:
# Output Sammy 5
Полученный нами вывод состоит из значений переменных, которые мы инициализировали для экземпляра new_shark .
Давайте создадим еще один объект класса Shark под названием stevie :
class Shark: def __init__(self, name, age): self.name = name self.age = age new_shark = Shark("Sammy", 5) print(new_shark.name) print(new_shark.age) stevie = Shark("Stevie", 8) print(stevie.name) print(stevie.age) # Output: # Sammy # 5 # Stevie # 8
Объект stevie , как и объект new_shark , передает параметры, специфичные для данного конкретного экземпляра класса Shark , чтобы присвоить значения переменным экземпляра.
То есть переменные экземпляра, принадлежащие объектам класса, позволяют каждому объекту или экземпляру иметь разные значения, присвоенные этим переменным.
Работа с переменными класса и экземпляра одновременно
Переменные класса и переменные экземпляра часто используются одновременно. Поэтому давайте рассмотрим такой пример, используя созданный нами класс Shark . Комментарии в программе описывают каждый этап процесса.
class Shark: # Переменные класса animal_type = "fish" location = "ocean" # Метод-конструктор с переменными экземпляра name и age def __init__(self, name, age): self.name = name self.age = age # Метод с переменной экземпляра followers def set_followers(self, followers): print("This user has " + str(followers) + " followers") def main(): # Первый объект. Установка переменных экземпляра метода-конструктора sammy = Shark("Sammy", 5) # Вывод переменной экземпляра name print(sammy.name) # Вывод переменной класса location print(sammy.location) # Второй объект stevie = Shark("Stevie", 8) # Вывод переменной экземпляра name print(stevie.name) # Использование метода set_followers и передача переменной экземпляра followers stevie.set_followers(77) # Вывод переменной класса animal_type print(stevie.animal_type) if __name__ == "__main__": main()
Когда мы запустим программу, используя python shark.py , мы получим следующий результат:
# Output Sammy ocean Stevie This user has 77 followers fish
Здесь мы использовали переменные класса и экземпляра в двух объектах класса Shark : sammy и stevie .
Заключение
В объектно-ориентированном программировании переменные на уровне класса называются переменными класса, а на уровне объекта – переменными экземпляра класса.
Это различие позволяет нам использовать переменные класса для инициализации объектов с определенным значением, присвоенным переменным, а переменные экземпляра — чтобы каждый объект мог иметь свои переменные.
Использование переменных, относящихся к классу или экземпляру, помогает придерживаться принципа DRY. То есть способствует уменьшению повторов в коде.
От редакции Pythonist. Рекомендуем также почитать статью «Чем отличаются методы класса, статические и «простые» методы».
Передача объекта из одного класса в другой
Надо перенести объект self.name из класса в timeofpersonedit в NewPersonEdit как осуществить?
Отслеживать
задан 15 ноя 2018 в 15:50
khalinmaxim khalinmaxim
633 11 11 серебряных знаков 25 25 бронзовых знаков
Опубликовав свой код полностью, вы увеличите получение решения на ваш вопрос.
15 ноя 2018 в 16:12
Мне надо перенести в def init
15 ноя 2018 в 16:14
перенести в def init — что?
15 ноя 2018 в 16:17
Из класса timeofpersonedit перенести значение объекта self.name в класс NewPersonEdit в объект self.name1
Python-сообщество
- Начало
- » Python для новичков
- » Передать переменную из функции в функцию одного класса.
#1 Май 2, 2016 04:16:50
vito-Z80 Зарегистрирован: 2015-09-10 Сообщения: 50 Репутация: 0 Профиль Отправить e-mail
Передать переменную из функции в функцию одного класса.
Решил попробовать с классами, вроде говорят “компактно”:
class PrintText(): def __init__(self,canvas=canvas,x=x,y=y,text='',font="Arial 10",outline=bg,fill='yellow'): self.x=x self.y=y self.canvas=canvas self.text=text self.font=font canvas.delete('all') canvas.create_text(x,y,text=text,anchor='nw',fill=fill) y1=font.split(' ') y1=int(y1[1])+(int(y1[1])/2)+y x1=width-(x*2) canvas.create_rectangle(x,y,x1,y1,outline=outline) outline1=outline global x1,y1,outline1 def activateOutLine(event): xCoord=canvas.canvasx(event.x) yCoord=canvas.canvasx(event.y) outline=outline1 if x xCoord x1 and y yCoord y1: outline=activeOutLine canvas.create_rectangle(x,y,x1,y1,outline=outline) text='some text' PrintText(text=text) bodyOne.bind('', PrintText.activateOutLine)
Пишут что не желательно объявлять переменные из функций глобальными.
global x1,y1,outline1 нужны в функции событии activateOutLine
x1,y1 — будут меняться в процессе…
Вообщем делал я то что ниже, но сам уже начал запутываться в том что делаю и решил в классы… в которых до сих пор туплю.
import call import configurations from tkinter import * root = Tk() width=1024 height=768 x=root.winfo_screenwidth()/2-(width/2) y=root.winfo_screenheight()/2-(height/2) root.wm_geometry("+%d+%d" % (x, y)) root.geometry("1024x768") root.title('Стальной канат') colorBg='red' colorText='#07485b' colorActiveText='#0d6986' colorActiveOutLine='#0d6986' x=10 y=10 widthMenu=int(width*0.20) # ширина Главного Меню (слева) widthMenuBorder=widthMenu-(x*2) widthDb=int(width*0.35) widthDbSelect=int(width*0.44) print(widthDb) heightCanvass=height-100-6 bodyTop = Canvas(root, width=1020, height=98,bg=colorBg, cursor="hand2") bodyMenu = Canvas(root, width=widthMenu, height=heightCanvass,bg=colorBg, cursor="hand2") bodyDb = Canvas(root, width=widthDb, height=heightCanvass,bg=colorBg, cursor="hand2") bodyDbSelect = Canvas(root, width=widthDbSelect, height=heightCanvass,bg=colorBg, cursor="hand2") img = PhotoImage(file="img/logo.gif") bodyTop.create_image(8,10, image=img, anchor='nw') # координаты x, y coordsDb=[] coordsMenu=[] fontMenu=configurations.fontMenu fontSubMenu=configurations.fontSubMenu fontDb=configurations.fontDb fileMenu=call.callMenu() fileDb=call.callDb() fileArhive=call.callArhive def coordsForCanvss(xx=0,yy=0,body=bodyDb,fileName=0,coords=FALSE,font='Arial '+str(10), setCoords=FALSE,active=FALSE,fill=colorBg,activeBorder=colorBg): body.delete('all') # очистка холста nextY=font.split(' ') # берем из font цифровое значение 'Arial N' nextY=int(nextY[1])*2 # для "резинового" просчета следующей строки fileName=fileName.readlines() # содержимое файла заданного в fileName print('RRRRRRRR ',fileName) for i in fileName: if setCoords != False: # если перепечатывать строки то не создавать новые координаты a=[xx,yy] coords.append(a) # создаем новые координаты в список xRazbor=0 # параметр прибавления к Х one=i.split('*') if body == bodyMenu: # если печатаем меню, то только первое слово (второе идет на имя файла) one=one[:1] # вытаскиваем первое слово for getRazbor in one: # печатаем содержимое ONE от одног до нескольких слов if active==[xx,yy]: # цвета текста при фокусе мышью fill=colorActiveText if activeBorder==1: # цвет бордюра при фокусе мышью. НОЛЬ = цвет фона холста # 1 = colorActiveOutLine activeBorder=colorActiveOutLine bodyMenu.create_rectangle(xx,yy,xx+widthMenuBorder,yy+nextY, fill=colorBg,outline=activeBorder) else: fill=colorText body.create_text(xx+xRazbor+x+(x/2),yy,text=getRazbor,font=font,anchor='nw', fill=fill) xRazbor+=60 # + N пикселей к следующему слову yy+=nextY # + Y для следующей строки coordsForCanvss(xx=x,yy=y,body=bodyMenu,fileName=fileMenu,coords=coordsMenu,font='Arial '+str(fontMenu),setCoords=True) coordsForCanvss(xx=x,yy=y,body=bodyDb,fileName=fileDb,coords=coordsDb,setCoords=True) print(coordsMenu) def menuSelect(event): import call def menuPressed(event): getNewFile=enterMenu.split('*') getNewFile=str(getNewFile[1]) getNewFile=getNewFile.split('\n') fileName=getNewFile[0] fileName=open(fileName,'r') print(fileName) if enterMenu == True: coordsForCanvss(xx=x,yy=y,body=bodyDb,fileName=fileName,coords=coordsDb, font='Arial '+str(fontDb)) bodyMenu.delete('all') xCoord=bodyDb.canvasx(event.x) yCoord=bodyDb.canvasx(event.y) getFile=call.callMenu() enterMenu='' coordsForCanvss(xx=x,yy=y,body=bodyMenu,fileName=call.callMenu(),coords=coordsMenu, font='Arial '+str(fontMenu),fill=colorText) for i in coordsMenu: printString=getFile.readline() if i[0] xCoord i[0]+widthDb and i[1] yCoord i[1]+fontMenu+8: enterMenu=printString print('sdfsdfsd',enterMenu) coordsForCanvss(xx=x,yy=y,body=bodyMenu,fileName=call.callMenu(),coords=coordsMenu, font='Arial '+str(fontMenu),active=i,fill=colorText,activeBorder=1) bodyMenu.bind('', menuPressed) bodyMenu.bind('',menuSelect) bodyTop.grid(row=0,column=0,columnspan=3,sticky='nw') bodyMenu.grid(row=1,column=0,sticky='nw') bodyDb.grid(row=1,column=1,sticky='nw') bodyDbSelect.grid(row=1,column=2,sticky='nw') mainloop()
Я уже подумываю заплатить кому нибудь, что бы разжевали мне КЛАССЫ по скайпу, нормальным языком…
Глянул тут, оказывается self делает переменную глобальную по всему классу, которую можно использовать в любой функции класса, когда читал Лутца до меня это не дошло.
Но я не могу сделать так в событии
def activateOutLine(self,event=NONE): self.event=event xCoord=canvas.canvasx(event.x) yCoord=canvas.canvasx(event.y) outline=self.outline if x self.xCoord self.x1 and y self.yCoord self.y1: outline=activeOutLine canvas.create_rectangle(x,y,self.x1,self.y1,outline=outline)
Отредактировано vito-Z80 (Май 2, 2016 05:03:33)
