Область объектов, передаваемых в качестве аргументов — Python

#python #object #sqlalchemy #pyqt4

#python #объект #sqlalchemy #pyqt4

Вопрос:

Я хочу отправить объект сеанса sqlalchemy в функцию другого класса .

От функции OraDialog класса oraconnect к функции assign класса oraconn .

На самом деле мне нужно использовать объект session в oraconn другой функции map

Я не могу отправить объект сеанса непосредственно в функцию map, потому что это слот — он запускается раньше. Я намеревался определить функцию assign в первую очередь для получения объекта сеанса.

Ошибка: (включая инструкции печати)

<sqlalchemy.orm.session.Session object at 0x030808F0>
<sqlalchemy.orm.session.Session object at 0x030808F0>
This is in assign
None
This is in map
Traceback (most recent call last):
File "C:UsersArulDesktopdbvisoraconn.py", line 44, in map
for t in self.s.query(tables):
AttributeError: 'NoneType' object has no attribute 'query'

Функции присваивания и сопоставления класса oraconn :

 def assign(self,s):
    self.s=s
    print self.s
    print "This is in assign"
def map(self):
    print self.s
    print "This is in map"
    self.table_no=0
    for t in self.s.query(tables):
        self.table_no=self.table_no 1
        table_list.append(t.table_name)
    self.item=QtCore.QStringList()
    for c in self.s.query(columns):
        self.item.append(c.column_name)
    self.ui.list_col.addItems(self.item)
  

ИТАК ,
Функция assign получает объект должным образом . Но функция map не может ее использовать — в ней указано Nonetype

Мой вопрос: Две функции одного класса не могут использовать объект?

Должно быть, я сделал что-то глупое — так что, пожалуйста, укажите……

(Я использую windows7 / python 2.6 / PyQt4 /sqlalchemy / cx_oracle)

Редактировать :
Вызывающий класс :

 class OraDialog(QtGui.QDialog):
def __init__(self,parent=None):
    QtGui.QDialog.__init__(self,parent)
    self.odia=Ui_Dialog()
    self.odia.setupUi(self)
    self.uiobj=oraconn()
    QtCore.QObject.connect(self.odia.but_con,QtCore.SIGNAL('clicked()'),self.uiobj.oraconnect)
def oraconnect(self):
    self.setVisible(0)
    eng_str="oracle://" self.odia.line_user.text() ":" self.odia.line_pass.text() "@localhost:1521/" self.odia.line_sid.text() "?mode=" self.odia.line_role.text()
    engine_str=str(eng_str)
    engine=create_engine(engine_str)
    Session=sessionmaker(engine)
    self.s=Session()
    print self.s
  

Проблема решена :
Проблема в том, что я создал два экземпляра и перешел от одного к другому.

Исправленный код :

 oraconn.assign(myapp,self.s)
  

где

oraconn -> класс

назначить -> функция oraconn

myapp -> экземпляр oraconn, объявленный для основного приложения

self.s -> аргумент, который я хотел передать

Спасибо, Кирк ….

Комментарии:

1. Покажите код, который приводит к этому. Как вызываются методы assign и map ?

2. Ваш первый фрагмент кода помечен как «Функция oraconnect класса OraDialog :». Я не могу понять, что вы там имеете в виду. Являются ли оба этих метода классом с именем OraDialog?

3. @Kirk Strauser, упс, извините, моя ошибка … сейчас я отредактировал .

Ответ №1:

Если вы используете Qt, то это, скорее всего, приложение с графическим интерфейсом. Возможно, есть проблемы с потоковой передачей; возможно, self ссылается на разные объекты. Трудно сказать только по тому, что вы нам дали. Прежде чем вы пойдете дальше, добавьте:

 print self
  

в верхней части каждого метода. По крайней мере, тогда вы сможете подтвердить, работают ли оба с одним и тем же объектом.


В OraDialog.init, вы говорите self.uiobj=oraconn() . Это тот объект, который вызывает у вас проблемы? Если это так: обратите внимание, что вы создаете at в качестве переменной экземпляра, так что каждый объект OraDialog имеет другой объект .uiobj. Не могли бы вы попробовать сделать это переменной класса, написав:

 class OraDialog(QtGui.QDialog):
    uiobj = oraconn()
    def __init__() [...]
  

вместо этого? То есть, определите uiobj как принадлежащие всем экземплярам класса, а не только одному экземпляру.

Комментарии:

1. да, я хочу открыть диалоговое окно, чтобы получить имя пользователя, пароль, а затем использовать их в QMainWindow…

2. я напечатал self в обеих функциях — получил два разных адреса. Кажется, вы правы — проблемы с потоками. Значения следующие: <__main__.объект oraconn в 0x02ED7660> это в assign <__main__.объект oraconn в 0x02DC4F18> это в map

Ответ №2:

Опубликованный вами код, похоже, в порядке, я не могу обнаружить никаких очевидных ошибок.

Проблема, должно быть, на стороне вызова. Поскольку ссылка на себя может быть передана явно методам (через OraDialog.map(my_object) , где my_object может быть что угодно), это вполне возможно. Также обратите внимание, что это не имеет ничего общего с областью видимости.

Вы должны проверить вызывающий код map функции. Очень вероятно, что это вызывается для другого объекта как assign .

Комментарии:

1. Обратите внимание, что вы не должны вызывать подобные методы. Это убивает полиморфизм, основу утиной типизации.

2. Я не говорил, что вы должны это делать, но это возможно, и это даже может быть причиной рассматриваемой проблемы. Вот почему я упомянул об этом.