【问题标题】:Creating a class for function storage为函数存储创建一个类
【发布时间】:2019-11-01 13:23:48
【问题描述】:

我正在为某个数据库编写代码。我想创建一些函数,这将使将内容写入数据库并从中取出内容变得更加容易。无论如何 - 我想做一些功能。

我的第一个想法是打开一个新的 .py 文件,在其中获取所有功能,然后使用:

from FileName import Function

然后使用它,它就可以工作。但是,如果有很多功能就不太好了,因为我需要手动导入我想要的每个功能:

from FileName import Function1 from FileName import Function2 from FileName import Function3

相比之下,当我使用import random 时,我可以在代码本身中使用random.func 并继续。

一位朋友建议创建一个班级。我没有想到这一点,因为我不想创建一个对象。例如,在我当前的课程代码中:

import sqlite3

conn = sqlite3.connect('asfan.db')
c = conn.cursor()

class Manager:

def save_chunk():
    c.execute("INSERT INTO DATA_CHUNKS VALUES(234, 'hello', '20190617', 'article')")
    conn.commit()
    c.close()
    conn.close()

在主目录中,我只需调用import Manager from File,它就可以正常工作。但是 PyCharm 不太喜欢我写的函数,因为该方法没有第一个参数(PyCharm 建议“Self”)并且是静态的。

那么这是“存储”函数的正确方法吗? 我希望得到一些帮助和参考资料,以了解我在寻找什么。

【问题讨论】:

  • 你可以对你的模块做同样的事情。 import FileName,然后写FileName.Function1

标签: python sqlite function class import


【解决方案1】:

我不建议仅将类用于函数存储。您需要创建一个实例来调用函数(实例本身无关紧要)或将每个函数都设为static or class method,这也不是一个好习惯。

通常,对于导入函数,您可以在一行中完成。

from module_name import fn_one, fn_two, fn_three

对于很多关于命名和导入的非常好的标准,我强烈建议阅读并采用PEP 8

我不知道您是否打算将“类代码”全部作为单个文件的内容,但是您应该小心在不同的上下文中打开和关闭资源;如果有人导入了该文件,则会打开一个数据库连接,但除非调用 save_chunk(然后该连接将不再可用),否则它不会关闭。

在这种特殊情况下,如果您更进一步并使用它来管理您的数据库连接,那么一个类可能是有意义的。 context manager 是管理数据库连接等设置和拆卸的常用方法。

这是already part of Python for SQLite,因此如果您想利用它的上下文管理器并添加实用功能,您可以继承sqlite.Connection

from sqlite3 import Connection


class SQLiteConnection(Connection):
    def test_schema(self):
        self.execute('CREATE TABLE test (name, location);')

    def test_populate(self):
        self.execute('''
            INSERT INTO test
            VALUES ('kungphu', 'Tokyo'),
                   ('Argento', 'Jerusalem')
        ''')

    def test_select(self):
        return self.execute('SELECT * from test')

示例用法:

>>> from scm import SQLiteConnection
>>> 
>>> with SQLiteConnection(':memory:') as conn:
...     conn.test_schema()
...     conn.test_populate()
...     for row in conn.test_select():
...         print(row)
... 
('kungphu', 'Tokyo')
('Argento', 'Jerusalem')

我在这里添加的方法......非常愚蠢,而且绝对不是处理固定装置或测试的好方法。它们只是为了说明如果在您的用例中有意义,您可以如何执行此操作。

【讨论】:

  • 嘿伙计,迟到总比永不好。谢谢您的帮助!我想我当时忘记回复了。
  • @Argento 哈哈,不客气。过去的爆炸!
猜你喜欢
  • 2021-07-28
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多