为什么我的Python mysql类__init__函数试图重载mysql包__init__函数?

定居者:

我想为我的python脚本创建一个简单的mysql连接类。该类的预期用途script.py

import db_connection

db = db_connection.DBConnection()
db.get_cursor()

该类本身在脚本中db_connect.py

import mysql.connector

class DBConnection:

def __init__(self):
    self.__host="192.168.1.22"
    self.__port="3306"
    self.__user="somename"
    self.__passwd="somepw"
    self.__database="mydbname"

def __connect(self):
    con = mysql.connector.connect(
    self.__host,
    self.__port,
    self.__user,
    self.__passwd,
    self.__database
    )

    print("connected.")
    return con

def get_cursor(self):
    con = self.__connect()
    cursor = con.cursor(dictionary=True)
    return cursor

我收到以下错误:

Traceback (most recent call last):
  File "C:/.../script.py", line 14, in <module>
    db.get_cursor()
  File "C:\...\db_connection.py", line 26, in get_cursor
    con = self.__connect()
  File "C:\...\db_connection.py", line 13, in __connect
    con = mysql.connector.connect(
  File "C:\...\Python\Python38-32\lib\site-packages\mysql\connector\__init__.py", line 219, in connect
    return MySQLConnection(*args, **kwargs)
  File "C:\...\Python\Python38-32\lib\site-packages\mysql\connector\connection.py", line 64, in __init__
    super(MySQLConnection, self).__init__(*args, **kwargs)
TypeError: __init__() takes 1 positional argument but 6 were given

Process finished with exit code 1

我的类中init函数和mysql包的init函数似乎存在问题我对Python不太熟练,无法理解我在做什么,因此非常感谢您的帮助。

dspencer:

毫无疑问,您的班级__init__方法隐藏了MySQLConnection问题是您将参数作为位置参数传递,而mysql.connector.connect要求将它们作为关键字参数传递,例如:

con = mysql.connector.connect(
    host=self.__host,
    port=self.__port,
    user=self.__user,
    password=self.__passwd,
    database=self.__database
)

您还可以参考文档中的一些示例

正如Matthias指出的,这里不需要两个下划线(普通用户编写的代码中很少需要)。要将这些变量标记为类的内部变量,通常使用单个下划线,即:

def __init__(self):
    self._host="192.168.1.22"
    self._port="3306"
    self._user="somename"
    self._passwd="somepw"
    self._database="mydbname"

您会遇到进一步的错误

ReferenceError:弱引用对象不再存在

因为您的连接只是临时的,并且存在于您get_cursor方法的范围之内该方法结束时将关闭连接。您可以通过将连接存储在类中来解决此问题,该类保留对打开的连接的引用,例如:

class DBConnection:

    def __init__(self):
        self._host="192.168.1.22"
        self._port="3306"
        self._user="somename"
        self._passwd="somepw"
        self._database="mydbname"
        self.con = None

    def _connect(self):
        self.con = mysql.connector.connect(
            host=self._host,
            port=self._port,
            user=self._user,
            password=self._passwd,
            database=self._database
        )

        print("connected.")

    def get_cursor(self):
        if not self.con:
            self._connect()
        return self.con.cursor(dictionary=True)

有关更多详细信息,请ReferenceError参见“弱引用对象不再存在”是什么意思?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章