Создание класса для хранения функций - PullRequest
0 голосов
/ 18 июня 2019

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

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

1 голос
/ 19 июня 2019

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

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

from module_name import fn_one, fn_two, fn_three

Для многих действительно хороших стандартов в отношении имен и импорта, среди прочего, я настоятельно рекомендую прочитать и принять PEP 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')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...