2012-03-13 72 views
0

我在Python中使用類實例時遇到了問題。 我創建了一個新的類ora,它繼承了cx_Oracle包中的connect類。 當我嘗試TU運行此代碼我recive信息Python中的類實例

文件 「pyt.py」,第12行,在更改爲MyQuery ora.myConnect.cursor() AttributeError的: 'NoneType' 對象沒有屬性 '遊標'

因此Python cannote認識到在ora.myConnect中存儲了對實例的引用。 我不知道t know what can be reason of this error and what it錯誤代碼。

from cx_Oracle import connect 

class ora(connect): 
    myConnect = None 

    def __init__(self,connstr):  
    ora.myConnect = connect.__init__(self,connstr) 


    def myquery(self): 
     ora.myConnect.cursor() 
     ora.myConnect.cursor.execute("SELECT * FROM table") 
     ora.myConnect.cursor.close() 



connstr = 'user/[email protected]:port/sid' 
connection = ora(connstr)  
connection.myquery()     
connection.close() 

EDIT

ve tried to replace ora to self but still Python don噸訪問實例

from cx_Oracle import connect 

class ora(connect): 
    myConnect = None 

    def __init__(self,connstr):  
    self.myConnect = connect.__init__(self,connstr) 
    def myquery(self): 
     self.myConnect.cursor() 
     self.myConnect.cursor.execute("SELECT * FROM table") 
     self.myConnect.cursor.close() 

錯誤: self.myConnect.cursor() AttributeError的: 'NoneType' 對象沒有屬性 '遊標'

EDIT2 這段代碼沒有OOP,對我來說self.myConnect sholud refere NCE到對象實例和該對象應包含法光標()

import cx_oracle 
connstr = 'user/[email protected]:port/sid' 
connection = cx_oracle.connect(connstr)     
cursor = connection.cursor()        
cursor.execute("SELECT * FROM table") 
cursor.close() 
connection.close() 
+0

'self.myConnect = connect .__ init __(self,connstr)'很奇怪。 '__init__'方法似乎不應該返回一個遊標。你確定你明白你正在擴展的班級應該如何工作? – beerbajay 2012-03-13 23:11:28

+0

根據[這裏的文檔](http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle.connect)我會說你不應該像你所做的那樣擴展'connect'。相反,只需從'__init__'調用'cx_Oracle.connect()'並將連接保存爲'self.myConnect'。 – beerbajay 2012-03-13 23:24:21

+0

self.myConnect sholud例如返回參照對象實例,而不 OOP此代碼的工作 進口cx_oracle connstr = '用戶/ passwd中@主機:端口/ SID' 連接= cx_oracle.connect(connstr) 光標=連接。遊標() 遊標。執行(「SELECT * FROM table」) cursor.close() connection.close() – browarq 2012-03-13 23:29:00

回答

2

好像你要self

class ora(connect): 
    myConnect = None 

    def __init__(self, connstr):  
     self.myConnect = connect.__init__(self, connstr) 

    # ... 

ora是類的名稱,而不是實例。

更新嘗試以下操作:

from cx_Oracle import connect 

class ora: 
    myConnect = None 

    def __init__(self, connstr):  
     self.myConnect = connect(connstr) 

    def myquery(self): 
     self.myConnect.cursor() 
     self.myConnect.cursor.execute("SELECT * FROM table") 
     self.myConnect.cursor.close() 
+0

如果你在'__init__'和'myquery'中用'self'代替'ora',你的'connection'對象應該是可用的。你遇到了什麼錯誤? – beerbajay 2012-03-13 23:07:19

+0

我有一個評論fromating的問題,所以我已經在第一篇文章中添加了更多細節 – browarq 2012-03-13 23:09:28

1

爲什麼你要self.myConnect來指代connect實例?這是對OOP的完全誤解。 ora實例connect實例。 self.cursor是你找到光標的地方。

這裏是你的代碼應該是什麼樣子:

class ora(connect): 

    def __init__(self,connstr):  
    super(ora, self).__init__(connstr) 

    def myquery(self): 
    self.cursor.execute("SELECT * FROM table") 
    self.cursor.close() 

在任何情況下,__init__必須永遠不會返回任何東西,所以設置self.myConnect的返回值將總是導致它被綁定到None

+0

謝謝 - 我不知道這個metod super,現在它工作的很好 – browarq 2012-03-13 23:47:24

+0

不要忘記標記答案爲接受,如果它解決了你的問題。 – 2012-03-14 00:20:55