使用python

时间:2016-02-24 17:26:49

标签: python class import

当我尝试访问self.cursor_dat' from class in different script. It says: ImportError时,我遇到了奇怪的错误:无法导入名称query_selection_class`。在不尝试访问变量的情况下也会发生错误。 import命令有问题。

这里是我创建变量的 file1.py

class connection_settings_class(QtGui.QMainWindow,Ui_main_connection_settings_window):
    def __init__(self):
        self.create_connection_window()
        self.host = 'localhost'
        self.port = '3307'
        self.user = 'root'
        self.password = ''
        self.database = 'rtr'

    def connection(self):
        """ connect to the database and create cursor that will be used to exetute MySQL queries """
        try:
             self.cnxn = pyodbc.connect(driver = '{MySQL ODBC 5.3 ANSI Driver}',  # ANSI or Unicode
                                        host = self.host,
                                        port = self.port,
                                        user = self.user,
                                        password = self.password,
                                        database = self.database)
        except:
            print('Connection FAIL')

        **self.cursor_dat** = self.cnxn.cursor()
        **self.cursor_dat**.execute("""SELECT * FROM test_db.attempt;""")
        row = **self.cursor_dat**.fetchone()
        if row:
            print("Succesfully connected to the database.")
            print row
            self.status_label.setText("Connected")
        else:
            print("Connection FAIL")
            self.status_label.setText("Disconnected")

    def create_connection_window(self):
        ...rest of the code

...这里是 file2

import file1  -> I also tried from file1 import connection_settings_class


class plausible_implausible_class(QtGui.QMainWindow,Ui_plausible_implausible_win):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.show()
    sc = MyStaticMplCanvas(self.centralwidget, width=500, height=400, dpi=100)
    self.verticalLayout_3.addWidget(sc)
    **a = file1.connection_settings_class.cursor_dat**

2 个答案:

答案 0 :(得分:0)

我可能会在看你的样本时犯下一个非常愚蠢的错误,但我看到的是:

 self.cursor_dat= self.cnxn.cursor()

connection_settings_class.connection()方法中定义。您永远不会调用connection(),因此永远不会创建该属性。

另外我注意到你是静态调用类,而不是创建类的实例,但是你没有创建静态属性,它们都是在__init__上创建的。您可能想要创建一个类的实例,然后最初将cursor_dat定义为None

如果您想要连接共享,可以设置连接池并仍然创建单个实例。

答案 1 :(得分:0)

好的,路径没有问题,因为@tdelaney提到的所有脚本都是正面的。 for循环的结果是'/ Users / BauchMAC / PycharmProjects / py_GUI / Database_GUI' - >真即可。我使用os.getcwd()获得的工作目录是相同的。

我还尝试创建两个新脚本,一切正常。所以问题是我不理解python中的“导入规则”,因为这是问题的根源。

因此越过进口存在明显问题。解决问题的方法是将值作为参数传递。

下面你可以看到我想要怎么做以及出错的原因:

文件1:

from try4 import ClassB

class ClassA():
    def __init__(self):
        self.cursor_dat = 1
        self.query_selection_win = ClassB()

object1 = ClassA()

文件2:

from try3 import ClassA <-- source of the probles

class ClassB():
    def __init__(self, cursor_dat):
        print(ClassA.cursor_dat)

以下是应该如何(至少它有效,我不确定它是否是最好的方法,我还是新手)

文件1:

from try4 import ClassB

class ClassA():
    def __init__(self):
        self.cursor_dat = 1
        self.query_selection_win = ClassB(self.cursor_dat)

object1 = ClassA()

文件2:

class ClassB():
    def __init__(self, cursor_dat):
        print(cursor_dat)

我希望这会对像我这样的新手有所帮助:)。