2017-04-06 71 views
0
import pyodbc 

class Database(object): 

    def connect(self): 
     connection = pyodbc.connect("""DRIVER={SQL Server}; 
             SERVER=XX\SQLEXPRESS; 
             DATABASE=ACCOUNT_DBF; 
             UID=sa;PWD=XXX""") 
     cursor = connection.cursor() 

    def check_account(self, usr): 
     cursor.execute("SELECT * FROM ACCOUNT_TBL WHERE account = ?", usr) 
     row = cursor.fetchone() 

     print(row[0]) 

database = Database() 
database.check_account("developer") 

因此,正如您所看到的,我嘗試使用參數「developer」調用「check_account」函數。但每當我執行/建立它,它給了我一個錯誤無法在對象範圍內調用Python類屬性

"NameError: name cursor not defined"

我很好奇和新的python如何實際做到這一點。我一直在網上搜索,但找不到針對我的問題的具體答案。

*我使用的是最新的python btw(3.6.1)。

+0

但是,您永遠不會調用'connect',並且即使您從未從該方法返回遊標或將其分配給實例變量,也不會丟失。 –

+0

你沒有將'cursor object'作爲參數傳遞給'check_account'函數 – Surajano

+0

@DanielRoseman你的評論對我沒有幫助,先生。但是,謝謝你。 –

回答

2

NameError異常被觸發,因爲在check_account方法中看不到connect方法中定義的局部變量。

由於您可以從所有方法(它是實例本身)訪問self,因此需要在「self」內部設置實例屬性。

def connect(self): 
    self.connection = pyodbc.connect("""DRIVER={SQL Server}; 
            SERVER=XX\SQLEXPRESS; 
            DATABASE=ACCOUNT_DBF; 
            UID=sa;PWD=XXX""") 
    self.cursor = connection.cursor() 

def check_account(self, usr): 
    self.cursor.execute("SELECT * FROM ACCOUNT_TBL WHERE account = ?", usr) 
    row = self.cursor.fetchone() 

    print(row[0]) 
+0

這解決了它。非常感謝你的明確答案! –

+0

我想向你提出另一個關於「自我」的問題。添加「自我」是好事嗎?每次都在班級範圍內? –

+0

它們是不同的東西......當你在一個類中定義一個函數時,默認情況下它是一個實例方法,並且每次調用該函數時,它都會傳遞「自己」的第一個參數,並且你擁有該對象本身。如果你真的想擁有類方法,你必須使用'@classmethod'裝飾器,並且傳遞的第一個參數將是Class,而不是實例。 –

0

嘗試:

class Database(object): 

def connect(self): 
    connection = pyodbc.connect("""DRIVER={SQL Server}; 
            SERVER=XX\SQLEXPRESS; 
            DATABASE=ACCOUNT_DBF; 
            UID=sa;PWD=XXX""") 
    self.cursor = connection.cursor() 

在代碼中,cursor是可變的,其下面以方法中,僅self.cursor可以存儲光標類,然後其它方法可以使用。

+0

嗨,謝謝你的評論。事實上,這將解決遊標問題,但。它會爭論連接變量沒有被定義太多。所以我所做的就是「自我」。在每個變量中。 –