Как обратиться к методу другого класса python
Перейти к содержимому

Как обратиться к методу другого класса python

  • автор:

Как корректно вызвать метод из другого класса?

Проблема состоит в том, что тело функции start срабатывает сразу при инициализации элемента меню, а не при нажатии. Также если даже переменная у меня заполнена, при нажатии на элемент, ничего не происходит.

import os import xlsxwriter from tkinter import * from tkinter.ttk import * from tkinter import filedialog class Analyze(object): def start(x): print(x+'123') class Interface(Frame): catalog = '' def chooseCatalog(self): self.catalog = filedialog.askdirectory() def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.parent.title("Обработка файлов") self.pack(fill=BOTH, expand = 1) self.parent.resizable(0, 0) self.centerWindow() self.addMenu() self.catalogButton = Button(self, text="Указать каталог с исходными файлами", command=self.chooseCatalog) self.catalogButton.place(x=0, y=0, width=500,height=50) def addMenu(self): menu = Menu(self.parent) new_item = Menu(menu, tearoff=0) new_item.add_command(label='Запуск', command=Analyze.start(self.catalog)) new_item.add_command(label='Выход', command=self.exit) menu.add_cascade(label='Файл', menu=new_item) self.parent.config(menu=menu) def centerWindow(self): userWidth = 500 userHeigth = 250 windowWidth = self.parent.winfo_screenwidth() windowHeigth = self.parent.winfo_screenheight() x = (windowWidth-userWidth)/2 y = (windowHeigth-userHeigth)/2 self.parent.geometry('%dx%d+%d+%d' % (userWidth, userHeigth, x, y)) def exit(self): self.quit() def main(): window = Tk() interface = Interface(window) window.mainloop() if __name__ == '__main__': main()
  • Вопрос задан более трёх лет назад
  • 1488 просмотров

Как вызвать метод из родительского класса python?

Для вызова метода из родительского класса в Python есть два способа:

  1. Явное обращение к методу предка
  2. Функция super()
class Counter: def __init__(self): self.value = 0 def inc(self): self.value += 1 def dec(self): self.value -= 1 # Создаем класс-потомок, при вызове inc увеличивающих значение дважды # Вариант 1 - с прямым обращением к предку: class DoubleCounter(Counter): def inc(self): Counter.inc(self) # явно обращаемся к методу класса предка Counter.inc(self) # и передаем ссылку на экземпляр # Вариант 2 - с применением функции super(): class DoubleCounter(Counter): def inc(self): super().inc() super().inc() num = DoubleCounter() num.value # 0 num.inc() # В обоих случаях, наследованный метод inc() будет работать одинаково num.value # 2 

Функция super() названа в честь названия класса-предка: «superclass». Потому что благодаря ей мы получаем ссылку на атрибут предка и заменяем обращение self , создавая таким образом связанный с текущим классом метод, который будет полноценной «оригинальной версией» из класса-предка. При чем если предок сменится, то super в описании класса учтет изменения, и мы получим доступ к поведению нового предка.

Как обратиться к значениям переменной одного класса из метода другого класса

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object.

Как обратиться к методу из другого метода внутри одного и того же класса
Доброго времени суток. Продолжаю изучение C#, и вот моя третья тема (или четвертая, за сегодня) с.

Как получить доступ к переменной находящейся в одном методе из другого метода в пределах одного класса
Привет всем! Очередной вопрос новичка, допустим, у меня есть метод 1, в котором назначена.

Как из одного метода обратиться к переменной другого?
Как в методе print вывести переменную f из метода SetC? -(void) setC: (float) f< .

Эксперт по компьютерным сетям

5890 / 3348 / 1034
Регистрация: 03.11.2009
Сообщений: 9,977
В eat можно передавать аргументом холодильник, из которого должна браться хавочка
Регистрация: 17.04.2022
Сообщений: 12

Jabbson,
Это понятно, я знаю, что я очень туплю где-то, но хоть убей не могу понять где

Вот, что у меня получилось, но ничего не работает
(задача в том, что при вызове функции eat() любой объект поел бы, но свою еду, при этом количество еды в доме должно уменьшаться)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
class Family: def __init__(self): self.house = House() print('Введите имена членов семьи') husband = Husband(input()) wife = Wife(input()) cat = Cat(input()) self.fam = [husband, wife, cat] class House: money = 100 people_food = 50 cat_food = 30 dirt = 0 class Animals: hunger = 30 saturation_coefficient = 1 eating = 30 def __init__(self, name): self.name = name def eat(self, house): if isinstance(self, Cat): self.eat2(house.cat_food) else: self.eat2(house.people_food) def eat2(self, food): if food  self.eating: self.hunger += food * self.saturation_coefficient food -= food else: self.hunger += self.eating * self.saturation_coefficient food -= self.eating class Cat(Animals): saturation_coefficient = 2 eating = 10 class People(Animals): happiness = 100 class Husband(People): happiness = 100 class Wife(People): happiness = 100 fam = Family() for i in fam.fam: if isinstance(i, Animals): print('Животное') if isinstance(i, Cat): print('кот') if isinstance(i, People): print('Человек') i.eat(fam.house) print(i.hunger) print(fam.house.people_food) print(fam.house.cat_food)

Обращение к функции другого класса

Есть учебное PyQT-приложение с 2 классами (с вполне рабочим кодом: вызовы элементами каждого класса друг друга проблем не вызывают). Непонятки для меня начинаются только при обращении из атрибутов одного класса (secondClass) к функциям другого (firstClass). Конкретнее:

1. попытка обратиться по коннекту (сигнал/слот) из второго класса к функции первого, типа:

1 2 3 4 5 6 7 8
# конструктор firstClass def self.oneFirst(self): print "FIRST" # конструктор secondClass self.pushButton.clicked.connect(firstClass().oneFirst)

не приводит ни к какому результату, но и ошибки не вызывает

2. попытка обратиться из функции второго класса к функции первого вызывает непонятное для меня сообщение о том, что в функции первого класса якобы отсутствует атрибут, который в ситуации обращения от «своей» же функции никаких ошибок не вызывает.

Т.е. если вызов к oneFirst() происходит из oneSecond() — появляется сообщение об отсутствии имеющегося атрибута (например, data), в то время как при вызове oneFirst() из соседней ей self.twoFirst() никаких исключений не наблюдается.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
# конструктор firstClass self.data = 1,2,3 def self.oneFirst(self): x + self.data print "FIRST" def self.twoFirst(self): self.oneFirst() # конструктор secondClass def self.oneSecond(self): firstClass().oneFirst()

Для меня эта проблема непонятна ещё и тем, что аналогичные вызовы функций другого класса, но из другого модуля проходят корректно.

Поэтому вопрос: правильно ли я обращаюсь к атрибутам другого класса? И в чем тут может быть секрет?
Очень странно, что в учебниках и статьях для начинающих этой темы вообще никогда не касаются.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Передача переменной из функции одного класса в функцию другого класса
Постараюсь вкратце доложить суть того, что должно происходить в программе, и с чем я столкнулся. .

Запуск функции из другого класса
Добрый день, как запустить функцию класса из другого класса? Нужно запустить updateItemMenu из.

Обращение к функции из другого класса
Есть функция заполнения таблицы товар в классе MainWindow я пытаюсь вызвать ее из другого класса.

Обращение к privat — членам класса из другого класса
Помогите пожалуйста! У меня есть задача. Написал методы которые должны быть в классе.

Эксперт Python

4615 / 2036 / 359
Регистрация: 17.03.2012
Сообщений: 10,102
Записей в блоге: 6
Я так понял, что secondClass создаётся где-то в firstClass.

ЦитатаСообщение от ilunga Посмотреть сообщение

self.pushButton.clicked.connect(firstClass().oneFirst)

Так вы просто создаёте новый экземпляр первого класса. Вместо firstClass() надо поставить self. И делать это не в конструкторе secondClass, а где-то в firstClass, обычно сразу после создания secondClass.

ЦитатаСообщение от ilunga Посмотреть сообщение

self.oneFirst()

ЦитатаСообщение от ilunga Посмотреть сообщение

firstClass().oneFirst()
Аналогично. Вы только и делаете, что создаёте новые экземпляры.
Регистрация: 03.09.2016
Сообщений: 18

нет, строками # конструктор я подразумеваю, что на этом месте стоит код конструктора, который я опустил. Я изобразил лишь схему проблемных взаимодействий. Потому что документ достаточно громоздкий. Сам вопрос проще. Каждая функция находится внутри своего класса, под объявлением конструктора.

Добавлено через 6 минут

ЦитатаСообщение от dondublon Посмотреть сообщение

Вместо firstClass() надо поставить self.

как я понимаю, self (опция принадлежности) ставится на атрибут внутри своего класса, а когда происходит обращение к атрибуту другого класса, вместо self указывается имя того класса, к которому принадлежит атрибут. По крайней мере, именно по такому принципу происходит вызов функций подключаемых модулей: модуль.класс.функция.

Но в пространстве одного модуля, обращение (ещё не уверен точно) получается в виде: класс.функция

2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830

ilunga, покажи код, тогда можно уже будет, что-то обсуждать, вообще это и яйца выведенного не стоит.

ЦитатаСообщение от ilunga Посмотреть сообщение

вместо self указывается имя того класса, к которому принадлежит атрибут.
Неа, тогда ты обращаешься к экземпляру нужного класса и у него вызываешь нужный метод.

Эксперт Python

4615 / 2036 / 359
Регистрация: 17.03.2012
Сообщений: 10,102
Записей в блоге: 6

ЦитатаСообщение от ilunga Посмотреть сообщение

как я понимаю, self (опция принадлежности) ставится на атрибут внутри своего класса, а когда происходит обращение к атрибуту другого класса, вместо self указывается имя того класса, к которому принадлежит атрибут.

self — сам этот класс, в котором происходит действие. Вы же хотите себя, то есть этот же класс, подписать на событие? Значит, подписывайте себя. Можно и кого-то другого, конечно, но из текстового описания я понял так, что надо себя.

Добавлено через 5 минут
Шпаргалка для начинающих:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from PyQt5.QtCore import pyqtSignal, QObject class FirstClass(QObject): def __init__(self): super().__init__() self.second = SecondClass() self.second.event.connect(self.on_event) def on_event(self): print('BOOM!') class SecondClass(QObject): event = pyqtSignal() cls1 = FirstClass() cls2 = cls1.second cls2.event.emit()

Обратите внимание: SecondClass ВАЩЕ ничего не знает про FirstClass. Так надо, а иначе вся система событий теряет смысл.

Добавлено через 3 минуты
Или даже так:

1 2 3 4 5 6 7 8 9 10
class SecondClass(QObject): event = pyqtSignal() def do(self): self.event.emit() cls1 = FirstClass() cls2 = cls1.second cls2.do()

Регистрация: 03.09.2016
Сообщений: 18

спасибо, конечно за отклик и ваше время, но ваша схема ничего общего не имеет с моей.
И, видимо, придется показать недоработанный (по функции enterFormula) код
(импортируемый модуль из QDesigner не показываю):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
from math import sin from PySide.QtCore import * from PySide.QtGui import * import sineWindow_UIs as ui class sineWidgetClass(QWidget): def __init__(self): super(sineWidgetClass, self).__init__() self.setWindowTitle('Sine') self.wave_height = 30 self.wave_len = 20 self.penWidth = 3 self.grid = 30 def paintEvent(self, event): self.rec = event.rect() self.painter = QPainter() self.painter.begin(self) # paint self.painter.fillRect(self.rec, Qt.black) self.painter.setPen(QPen(QBrush(Qt.gray), 0.5)) self.painter.setFont(QFont('Arial', 8)) for i in range(0, self.rec.width(), self.grid): self.painter.drawLine(i, 0, i, self.rec.height()) if self.grid>20: self.painter.drawText(i+3, 12, str(i)) for i in range(0, self.rec.height(), self.grid): self.painter.drawLine(0, i, self.rec.width(), i) self.painter.setRenderHint(QPainter.Antialiasing) self.painter.setPen(QPen(QBrush(Qt.yellow), self.penWidth)) self.prevx = 0 self.prevy = (0*self.wave_height)+(self.rec.height()/2) # self.enterFormula() # end self.painter.end() def pressBtn(self): print 'BTN' self.enterFormula() def enterFormula(self): print 'BTN' # formula = sineWindowClass().lineEdit.text() # print formula formula = 'sin(x * self.wave_len * 0.01)' for x in range(1, self.rec.width()): s = eval(formula) y = (s*self.wave_height) + (self.rec.height()/2) self.painter.drawLine(QPointF(self.prevx, self.prevy), QPointF(x, y)) self.prevx = x self.prevy = y def setHeight(self, v): self.wave_height = v self.update() def setLen(self, v): self.wave_len = v self.update() def setWidth(self, v): self.penWidth = v self.update() def setGrid(self, v): self.grid = v self.update() class sineWindowClass(QMainWindow, ui.Ui_sineWidgetWIndow): def __init__(self): super(sineWindowClass, self).__init__() self.setupUi(self) self.sine = sineWidgetClass() self.sine_ly.addWidget(self.sine) self.hgt_sld.setValue(20) self.len_sld.setValue(20) self.grid_sld.setValue(30) self.lineEdit.setText('sin(x)') self.hgt_sld.valueChanged.connect(self.sine.setHeight) self.len_sld.valueChanged.connect(self.sine.setLen) self.wdt_sld.valueChanged.connect(self.sine.setWidth) self.grid_sld.valueChanged.connect(self.sine.setGrid) self.pushButton.clicked.connect(sineWidgetClass().pressBtn) if __name__ == '__main__': app = QApplication([]) w = sineWindowClass() w.show() app.exec_()

Как я и указывал в своей первой схеме, мне надо (примитивно) из 90-й строки вызвать функцию на 47-ой. Никакой self для pressBtn тут не работает — потому что во втором классе нет такой функции, о чем и уведомляется в AttributeErrors: ‘sineWindowClass’ object has no attribut ‘pressBtn’

В целом, мне важно понять — как это можно сделать.

Добавлено через 9 минут
сорри, у меня там не напрямую 47, а через функцию на 43 строке — но это сути не меняет.

Добавлено через 12 минут
мне надо было обращаться через объект второй функции self.sine

т.е. 90 строка: self.pushButton.clicked.connect(self.sine.pressBtn)

Добавлено через 1 час 37 минут
спасибо, больше понял по своему упражнению, но также понял, что и вы пытались показать то же.
В целом, сдвинулось с мертвой точки.

А также я понял, что так и не выяснил до конца — почему я могу вызвать любую функцию или переменную из другого класса другого модуля, но не могу аналогично обратиться к другому классу в этом же окне?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *