创建一个用于函数存储的类

时间:2019-06-18 20:54:40

标签: python sqlite function class import

我正在为某个数据库编写代码。我想创建一些函数,这将使将事情写到db以及从那里得到东西变得更加容易。无论如何-我想做一些功能。

我的第一个想法是打开一个新的.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”)并且是静态的。

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

1 个答案:

答案 0 :(得分: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')

我在这里添加的方法非常愚蠢,绝对不是处理固定装置或测试的好方法。它们只是为了说明如果在您的用例中有意义,您将如何去做。