2017-04-06 1 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") 

aufgerufen werden So, wie Sie sehen können, ich versuche, die Funktion "check_account" mit dem Parameter "Entwickler" aufzurufen. Aber immer, wenn ich ausführen/baut es, es gibt mir einen Fehler vonPython-Klasse-Attribut kann nicht innerhalb Objektbereich

"NameError: name cursor not defined"

Ich bin gespannt und neu zu Python, wie eigentlich zu tun. Ich habe im Internet gesucht, aber ich kann keine spezifische Antwort für mein Problem finden.

* Ich benutze die neueste Python BTW (3.6.1).

+0

Aber Sie rufen niemals 'connect' auf, und selbst wenn Sie den Cursor nie von dieser Methode zurückgegeben haben oder ihn der Instanzvariablen zuweisen, ist er verloren. –

+0

Sie haben 'cursor object' nicht als Parameter an' check_account' übergeben Funktion – Surajano

+0

@DanielRoseman Ihr Kommentar hilft mir nicht Sir. Aber danke trotzdem. –

Antwort

2

Die Ausnahme wird ausgelöst, da in der Methode check_account keine lokalen Variablen angezeigt werden, die in der Methode connect definiert sind.

Sie müssen die Instanzattribute "inside" self setzen, da Sie von allen Methoden auf self zugreifen können (es ist die Instanz selbst).

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

Das hat es behoben. Vielen Dank für die klare Antwort! –

+0

Ich möchte Ihnen eine weitere Frage bezüglich des "Selbst" hinzufügen. Ist es gut, "Selbst" hinzuzufügen? immer im Klassenraum? –

+0

Sie sind verschiedene Dinge ... Wenn Sie eine Funktion in einer Klasse standardmäßig definieren, ist dies eine Instanzmethode, und jedes Mal, wenn diese Funktion aufgerufen wird, wird das erste Argument übergeben, in dem Sie das Objekt selbst haben. Wenn Sie wirklich Klassenmethoden haben wollen, müssen Sie '@ classmethod' decorator verwenden und das erste übergebene Argument ist die Klasse, nicht die Instanz. –

0

Versuchen:

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() 

in Ihrem Code ist cursor Variable, die unterhalb der Methode, nur self.cursor Cursor in die Klasse speichern kann, und dann können andere Methoden verwenden.

+0

Hallo, danke für den Kommentar. In der Tat wird das Problem mit dem Cursor behoben. Es wird argumentieren, dass die Verbindungsvariable nicht definiert ist. Was ich also tat, war "Selbst". in jeder Variable. –

Verwandte Themen