我正在为某个数据库编写代码。我想创建一些函数,这将使将事情写到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”)并且是静态的。
那么这是“存储”函数的正确方法吗? 我希望获得一些帮助和参考,以了解我在寻找什么。
答案 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')
我在这里添加的方法非常愚蠢,绝对不是处理固定装置或测试的好方法。它们只是为了说明如果在您的用例中有意义,您将如何去做。