2011-06-03 27 views
0

我想將sqlalchemy的會話對象發送到另一個類的函數。作爲參數傳遞的對象範圍 - Python

類OraDialog的功能oraconnect類oraconn分配功能。

其實我需要的是使用會話對象oraconn的另一個功能地圖

,因爲它是一個我不能直接發送會話對象地圖功能插槽 - 它之前被觸發。 我打算定義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) 

SO, 的分配功能適當地接收對象。但是地圖功能不能使用它 - 它表示Nonetype

我的問題: 同一類的兩個函數不能使用一個對象嗎?

我一定做了什麼愚蠢的 - 所以PLZ指出......

(我用的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 

問題就迎刃而解了:
的proble米是 - 我創建了兩個實例,並從一個傳遞到另一個。

更正代碼:

oraconn.assign(myapp,self.s) 

其中
oraconn - >類
分配 - > oraconn
MyApp的功能 - > oraconn的實例,宣佈爲主要應用
self.s - >的論點我想通過

謝謝柯克....

+0

顯示導致此問題的代碼。如何調用'assign'和'map'方法? – delnan 2011-06-03 16:00:35

+0

你的第一個代碼片段被標記爲「The OraDialog類的oraconnect函數:」。我無法分辨你的意思。這兩個方法在一個名爲OraDialog的類中? – 2011-06-03 19:38:17

+0

@Kirk Strauser,哎呀,對不起,我的錯誤...我現在編輯過。 – vettipayyan 2011-06-04 04:58:17

回答

2

如果你使用Qt,那麼這可能是一個GUI應用程序。也許有線程問題;也許self指的是不同的對象。只有你給我們的東西很難說。在您繼續之前,請添加:

print self 

靠近每個方法的頂部。至少可以確認兩者是否在同一個對象上運行。


在OraDialog中。 init,你的意思是self.uiobj=oraconn()。這是否會給你帶來問題?如果是這樣的話:請注意您正在創建一個實例變量,以便每個OraDialog對象具有不同的.uiobj對象。您可以嘗試通過書寫來製作一個類變量:

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

而不是?也就是說,將uiobj定義爲屬於該類的所有實例,而不僅僅是一個實例。

+0

你好,我想彈出一個對話框來獲得一些用戶名,密碼,然後在QMainWindow中使用它們... – vettipayyan 2011-06-03 16:11:45

+0

我在這兩個函數都打印了自己 - 得到了兩個不同的地址。看來你是正確的 - 線程問題。這些值是:<__ main __。oraconn object at 0x02ED7660> 這是分配 <__ main __。oraconn object at 0x02DC4F18>這是在地圖 – vettipayyan 2011-06-03 16:40:03

0

您發佈的代碼似乎沒問題,我找不到任何明顯的錯誤。

問題必須在呼叫方。由於自引用可以明確地傳遞給方法(通過OraDialog.map(my_object),其中my_object可能是任何東西),這是完全可能的。還要注意,這與範圍界定無關。

您應該檢查map函數的調用代碼。它很可能被稱爲不同的對象,如assign

+0

請注意,您不應該調用這樣的方法。它殺死了多態性,這是鴨子打字的基礎。 – delnan 2011-06-03 16:04:09

+0

我沒有說你應該這樣做,但這是可能的,甚至可能是問題的原因。這就是我提到它的原因。 – sebasgo 2011-06-03 16:07:54