Объем объектов, переданных в качестве аргументов - Python - PullRequest
0 голосов
/ 03 июня 2011

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

Из класса Функция OraDialog oraconnect в класс oraconn * назначить функция.

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

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

Ошибка: (включая операторы печати)

<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:\Users\Arul\Desktop\dbvis\oraconn.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)

ТАК, Функция назначить получает объект правильно. Но функция карты не может использовать это - это говорит, что 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 -> аргумент, который я хотел передать

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

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

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

print self

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


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

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

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

0 голосов
/ 03 июня 2011

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

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

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

...