2016-08-11 4 views
-1

Ich schreibe eine Klasse für den Zugriff auf eine MySQL-Datenbank von Python.Python - kann nicht auf Klasseneigenschaft zugreifen

Hier ist der Code:

#!/usr/bin/python 

import MySQLdb 
import configparser 

class db(): 

    def __init__(self): 

     try: 
      self.handler = MySQLdb.connect(host="localhost", user=user, passwd=passwd, db=dbname) 
      self.cur = self.handler.cursor() 
     except: 
      print "Couldn't connect to db" 


    def query(self, query): 

     self.lastQuery = query 
     self.res = self.cur.execute(query) 

    def close(self): 

     self.handler.close() 

Wenn ich versuche, um die Klasse zu nennen, es gibt mir die folgende Fehlermeldung:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "db.class.py", line 6, in <module> 
    class db(): 
File "db.class.py", line 25, in db 
    self.res = self.cur.execute(query) 
NameError: name 'self' is not defined 

Ich habe Menschen auf der Suche und häufig gibt es, die vergessen um die Methode mit 'self' als Argument zu definieren. Aber ich schließe es ein.

Konnte mir jemand helfen?

Danke.

UPDATE:

Ich habe Leerzeichen und Tabulatoren und das ist nicht das Problem.

Antwort

5

Ihr Code enthält Tabstopps und Leerzeichen, wodurch Python verwirrt wird, welche Anweisungen auf welcher Einrückungsstufe stehen. Die Zuordnung zu self.res endete auf Klassenebene, außerhalb der Methode, zu der sie gehören sollte.

Stoppt das Mischen von Tabulatoren und Leerzeichen. Aktivieren Sie "show whitespace" in Ihrem Editor, um das Problem besser sichtbar zu machen, und ziehen Sie in Betracht, Python mit dem Flag -tt auszuführen, um einen Fehler beim mehrdeutigen Mischen von Tabs und Leerzeichen zu geben.

+0

Ich bin sicher, dass Leerzeichen nicht das Problem sind. – Ign

+1

@Ign: Die Bearbeitungsansicht zeigt deutlich Registerkarten und Leerzeichen, die so gemischt sind, dass sie diesen Fehler verursachen, und das Traceback zeigt deutlich, dass die 'self.res'-Zuweisung außerhalb jeder Methode liegt. Sind Sie sicher, dass Sie wissen, wonach Sie suchen sollen? Wenn Sie nur den Einzug der gerenderten Version Ihrer Frage überprüft haben, beachten Sie, dass das Markdown-Rendering Tabulatoren in Leerzeichen konvertiert. Überprüfen Sie Ihre tatsächliche Quelldatei. – user2357112

Verwandte Themen