aliens
Дек. 1, 2007 17:54:54
Подскажите пожалуйста, как мне из 1 класса, вызвать методы другого класса?
Ситуация:
имеется три файла:
1. dbclass - с классом DBCon
2. mainform - с классом Ui_mainDialog ( гуи на Qt4 )
3. ngmain - основной файл,в котором создаются 2 объекта этих классов. ( mainwindow, и dbase )
Задача: при нажатии кнопки ( описана в mainform ) вызывать метод из dbase ( DBCon ). Как такое реализовать? желательно с примером.. Спасибо
bialix
Дек. 1, 2007 18:15:50
сделать экземпляры классов (mainwindow dbase) глобальными переменными и дергать нужный метод напрямую:
dbase.my_method()
aliens
Дек. 1, 2007 18:17:37
эм… а еще есть какие нибудь способы?
poltergeist
Дек. 1, 2007 20:31:58
В моём понимании красоты это выглядело бы так:
- Создаём основной класс в “ngmain.ру” и в нём уже создаём два дочерних класса - для гуя и бд;
- В методе инициализации этих класов ( __init__(self, parent) ) передаём в качестве параметра себя же (self)
- Когда надо будет вызвать метод соседнего класса, вызываем его так: self.parent.dbase.my_method()
Надеюсь пример не потерял наглядности, а то я увлёкся немного:) (надо кликнуть мышкой по форме, чтобы увидеть результат)
from PyQt4 import QtCore, QtGui
import sys, os
#————————————————————————————————————————————–
class DBCon(object):
def __init__(self, parent): self.parent = parent
#
def __setParent(self, parent): self.__parent = parent
def __getParent(self): return self.__parent
def __delParent(self): del self.__parent
parent = property(__getParent, __setParent, __delParent, ‘Parent class’)
#
def my_method(self): return ‘OK’
#————————————————————————————————————————————–
class Ui_mainDialog(QtGui.QWidget):
def __init__(self, parent):
self.parent = parent
#
super(Ui_mainDialog, self).__init__()
#
def __setParent(self, parent): self.__parent = parent
def __getParent(self): return self.__parent
def __delParent(self): del self.__parent
parent = property(__getParent, __setParent, __delParent, ‘Parent class’)
#
def mousePressEvent(self, event):
result = self.parent.dbase.my_method()
QtGui.QMessageBox.information(self, ‘The Tool’, u'Result: %s' % unicode(result))
#————————————————————————————————————————————–
class Main(object):
def __init__(self):
self.dbase = DBCon(self)
self.mainwindow = Ui_mainDialog(self)
#
def __setDBCon(self, dbase): self.__dbase = dbase
def __getDBCon(self): return self.__dbase
def __delDBCon(self): del self.__dbase
dbase = property(__getDBCon, __setDBCon, __delDBCon, ‘DB Connection’)
#
def __setUI(self, mainwindow): self.__mainwindow = mainwindow
def __getUI(self): return self.__mainwindow
def __delUI(self): del self.__mainwindow
mainwindow = property(__getUI, __setUI, __delUI, ‘GUI’)
#————————————————————————————————————————————–
app = QtGui.QApplication(sys.argv)
tool = Main()
tool.mainwindow.show()
sys.exit(app.exec_())
#————————————————————————————————————————————–
aliens
Дек. 1, 2007 23:48:14
poltergeist
Большое спасибо! все понял :)
aliens
Янв. 9, 2008 03:26:36
охохо. Извините что поднимаю старую тему. В прошлый раз как то сделал, т.к. там было полегче ( надо было не двусторонню связь так сказать). А сейчас вот проблемка появилась.
poltergeist
подскажи по своему этому коду.
Что делать, если надо сделать связь между тремя классами? :(
Подскажите, где б почитать про классы. Спасибо большое
poltergeist
Янв. 9, 2008 10:06:19
А там без разницы сколько классов общаются между собой, если у них один парент и они знают о существовании друг друга.
Писать пример наверное не буду, просто чтоб сами до этого дошли, а читать нужно теорию ООП (Объектно-ориентированного программирования) и потом уже курить её реализацию и возможности в питоне.
links:
http://ru.wikipedia.org/wiki/Объектно-ориентированное_программированиеhttp://www.python.org/doc/newstyle/
aliens
Янв. 9, 2008 14:53:02
спасибо.
Про много классов я потом допер :) А так, надо практиковаться