2017-04-06 70 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

嗨,谢谢你的评论。事实上,这将解决游标问题,但。它会争论连接变量没有被定义太多。所以我所做的就是“自我”。在每个变量中。 –