2014-05-21 90 views
0

我不知道爲什麼我有這個錯誤。請賜教。這裏是我的代碼: 文件名:sqlfunc.pyPhyton3錯誤>>未定義全局名稱'self'

from sqlalchemy import create_engine 
class SQL: 
    def __init__(self): 
     self.connection_string = '' 
     self.sql = '' 

    def exec_nonquery(connection_string, sql): 
     self.connection_string = connection_string 
     self.sql = sql 
     self.__connection = self.__mydb(self.connection_string) 
     self.__transaction = self.__connection.begin() 
     try: 
      self.__connection.execute(self.sql).fetchall() 
      self.__transaction.commit() 
     except: 
      self.__transaction.rollback() 
      raise 
     _connection.close() 

    def exec_query(self, connection_string, sql): 
     self.connection_string = connection_string 
     self.sql = sql 
     self.__connection = self.__mydb(self.connection_string) 
     self.__result = None 
     self.query_result = [] 
     try: 
      self.__result = self.__connection.execute(sql) 
      self.query_result = list(self.__result) 
     except: 
      raise 
     self.__connection.close() 
     return self.query_result 

現在,我想:

from sqlfunc import SQL 
SQL.exec_nonquery('mssql+pyodbc://scott:[email protected]','select * from table1') 

,我得到這個錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "./sqlfunc.py", line 25, in exec_nonquery 
    self.connection_string = connection_string 
NameError: global name 'self' is not defined 

有什麼我做錯了或丟失?

我改變exec_nonquery到

def exec_nonquery(self, connection_string, sql) 

但它使我這個錯誤: 「有什麼我做錯了或丟失」

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: exec_nonquery() missing 1 required positional argument: 'sql' 
+0

你想在這裏做什麼,使用'SQL.exec_nonquery()'作爲類方法?您沒有該方法的「自我」參數,也不會有這樣的參數,因爲沒有* instance *綁定到該參數。 –

+2

你是否期望在這裏發生什麼?爲什麼不在連接字符串中再次傳入SQL *()*實例*,讓它處理連接字符串並調用'exec_nonquery)'*?你似乎還不知道類和實例是如何工作的。 –

+0

是的,這就是爲什麼我試圖通過這裏來理解。 –

回答

4

- 是的,你沒有包括self作爲第一個位置參數的方法:

​​

應該

def exec_nonquery(self, connection_string, sql): 
       #^see here 

你也在努力呼籲類此實例方法。最小的解決方法是:

sql = SQL() # create instance 
sql.exec_nonquery('mssql+pyodbc://scott:[email protected]', 
        'select * from table1') # call method 

但馬亭指出你真的應該重構類做出最OOP的。

+0

它被用作類方法。 –

+0

我試過了。請參閱編輯。但會發生新的錯誤。 –

+4

@MartijnPieters那麼它應該是'cls'而不是'self'並裝飾'@ classmethod'但是答案是一樣的 – jonrsharpe

相關問題