【问题标题】:Self is not passed to the class method in Python [closed]自我没有传递给Python中的类方法[关闭]
【发布时间】:2018-12-25 21:41:40
【问题描述】:

我正在尝试以下 python 代码:

import sqlite3
class database:

    def __init__(self):
        self.conn = sqlite3.connect("warehousedb.db")
        self.cursor = self.conn.cursor()
        self.cursor.execute(
            "CREATE TABLE IF NOT EXISTS `admin` (admin_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username TEXT, password TEXT)")
        self.cursor.execute(
            "CREATE TABLE IF NOT EXISTS `product` (product_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, product_name TEXT, product_qty TEXT, product_price TEXT)")
        self.cursor.execute("SELECT * FROM `admin` WHERE `username` = 'admin' AND `password` = 'admin'")

        if self.cursor.fetchone() is None:
            self.cursor.execute("INSERT INTO `admin` (username, password) VALUES('admin', 'admin')")
            self.conn.commit()


    def __del__(self):
        self.cursor.close()
        self.conn.close()

    def Execute_SQL(self, sql):
        self.cursor.execute(sql)
        self.conn.commit()

    def Get_SQL(self, sql):
        self.cursor.execute(sql)
        return self.cursor.fetchall()

    def Get_SQL_One_Rec(self, sql):
        self.cursor.execute(sql)
        return self.cursor.fetchone()

然后在尝试这段代码时:

db = database()    
st = "SELECT * FROM `admin` WHERE `username` = '" + USERNAME.get() + "' AND `password` = '" + PASSWORD.get() + "'"
rec = db.Get_SQL_One_Rec(st)

我收到以下错误:

rec = db.Get_SQL_One_Rec(st) TypeError:Get_SQL_One_Rec() 缺少 1 个必需的位置参数:'sql'

我可以从 Python 文档中看到 Self 对象是自动传递的,那么为什么会出现此错误?

【问题讨论】:

  • 你事先实例化了database 类吗?
  • 你没有使用类吗?班级。实例只传递给类的实例,而不传递给类本身
  • 不要在名称上使用双下划线。这不是您要使用的约定;使用 single 下划线来暗示某些东西应该是私有的。双下划线调用名称修改,只是一团糟。在 Python 中不能有真正的私有变量。
  • 那个链接是完全错误的。 Python 没有私有的,只有一个约定,即不属于公共 API 的属性以 单下划线为前缀,双下划线用于 name-mangling,以防止子类中的冲突,它不是私有的。无论如何,你的global 声明没有做任何事情
  • 请听听有经验的 Python 程序员告诉你什么。 Python确实没有有私有变量,global这一行是无稽之谈,应该删除。

标签: python sqlite class oop object


【解决方案1】:

您提供的代码有效,请参阅此链接:

https://repl.it/@zlim00/self-is-not-passed-to-the-class-method-in-python

与您的代码相比的唯一区别是此 sqllite 数据库位于内存中而不是文件中。因此,如果代码对您不起作用,则错误在于您尚未提交的部分代码。

代码(如果链接被删除):

import sqlite3
class database:
    def __init__(self):
        self.conn = sqlite3.connect(":memory:")
        self.cursor = self.conn.cursor()
        self.cursor.execute(
            "CREATE TABLE IF NOT EXISTS `admin` (admin_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username TEXT, password TEXT)")
        self.cursor.execute(
            "CREATE TABLE IF NOT EXISTS `product` (product_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, product_name TEXT, product_qty TEXT, product_price TEXT)")
        self.cursor.execute("SELECT * FROM `admin` WHERE `username` = 'admin' AND `password` = 'admin'")

        if self.cursor.fetchone() is None:
            self.cursor.execute("INSERT INTO `admin` (username, password) VALUES('admin', 'admin')")
            self.conn.commit()


    def __del__(self):
        self.cursor.close()
        self.conn.close()

    def Execute_SQL(self, sql):
        self.cursor.execute(sql)
        self.conn.commit()

    def Get_SQL(self, sql):
        self.cursor.execute(sql)
        return self.cursor.fetchall()

    def Get_SQL_One_Rec(self, sql):
        self.cursor.execute(sql)
        return self.cursor.fetchone()

if __name__ == '__main__':
    db = database()    
    st = "SELECT * FROM `admin` WHERE `username` = '" + 'admin' + "' AND `password` = '" + 'admin' + "'"
    rec = db.Get_SQL_One_Rec(st)
    print(rec)

【讨论】:

  • 感谢 SimonF... 它就像魔术一样工作。
  • 但是还是不明白为什么,是因为MS Windows吗?即使我恢复我的旧代码但使用你的 :memory: 修改它也可以工作。
  • :memory: 更改不是为了让它工作,只是为了避免创建文件并确保每次运行测试的起点都是一个空数据库。它应该没有区别,因此代码应该适用于任何数据库。
  • 感谢 SimonF,感谢所有帮助我的人。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2019-09-25
  • 2020-04-29
相关资源
最近更新 更多