Создание класса для хранения функций

Я работаю над кодом для определенной базы данных. Я хочу создать некоторые функции, которые облегчат запись в БД и получение оттуда. Во всяком случае - я хочу сделать некоторые функции.

Моей первой мыслью было просто открыть новый файл .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.

chepner 18.06.2019 23:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы не рекомендовал использовать класс исключительно для хранения функций. Вам нужно либо создать его экземпляр для вызова функций (при этом сам экземпляр не имеет значения), либо сделать каждую функцию статический метод или метод класса, что также не является хорошей практикой.

Как правило, для импорта функций вы можете сделать это в одной строке.

from module_name import fn_one, fn_two, fn_three

Помимо множества действительно хороших стандартов, касающихся именования и импорта, я настоятельно рекомендую прочитать и принять ПКП 8.

Я не знаю, предполагалось ли, что этот «код класса» будет содержимым одного файла, но вы должны быть осторожны при открытии и закрытии ресурсов в разных контекстах; если кто-то импортирует этот файл, соединение с базой данных будет открыто, но оно не будет закрыто, пока не будет вызван save_chunk (и тогда соединение больше не будет доступно).

В этом конкретном случае класс может иметь смысл, если вы пойдете немного дальше и будете использовать его для управления подключением к базе данных. менеджер контекста — это распространенный и полезный способ управления настройкой и отключением для таких вещей, как подключения к базе данных.

Это уже часть Python для 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 02.10.2021 23:36

@Ардженто Ха-ха, пожалуйста. Взрыв из прошлого!

kungphu 04.10.2021 07:28

Другие вопросы по теме