作为参数传递的对象的范围 - Python

时间:2011-06-03 15:46:16

标签: python object sqlalchemy pyqt4

我想将sqlalchemy的会话对象发送到另一个类的函数。

从课程 OraDialog 的功能 oraconnect 到课程 oraconn 分配 功能。

实际上我需要在 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:\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)

所以, 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 - &gt;类
分配 - &gt;奥拉康的功能
myapp - &gt; oraconn的一个例子,申请主要申请
self.s - &gt;我想传递的论点

谢谢Kirk ....

2 个答案:

答案 0 :(得分:2)

如果您使用Qt,那么这可能是一个GUI应用程序。也许有线程问题;也许self指的是不同的对象。只有你给我们的东西很难说清楚。在继续之前,请添加:

print self

靠近每个方法的顶部。至少那时你可以确认两者是否在同一个对象上运行。


在OraDialog。 init 中,您说self.uiobj=oraconn()。这是给你问题的对象吗?如果是这样:请注意您正在创建一个实例变量,以便每个OraDialog对象都有一个不同的.uiobj对象。你可以尝试写一个类变量:

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

代替?也就是说,将uiobj定义为属于该类的所有实例,而不仅仅是一个实例。

答案 1 :(得分:0)

您发布的代码似乎没问题,我无法发现任何明显的错误。

问题必须在呼叫方面。由于自引用可以明确地传递给方法(通过OraDialog.map(my_object),其中my_object可以是任何东西)这完全可能。另请注意,这与范围无关。

您应该检查map功能的调用代码。很可能它被称为assign的其他对象。