Как лучше всего изменить атрибут класса (себя) с помощью внешнего / вспомогательного файла (т.е. модуля) в Python? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть приложение Flask, которое становится очень большим, и я хотел бы переместить некоторые функции класса во внешний файл, так как файл превышает 500 строк. Эти функции имеют некоторые logi c для изменения некоторых атрибутов класса и большие (с точки зрения строк).

Ниже приведен демонстрационный сценарий, в котором я пытаюсь отслеживать количество запросов. Предположим, что increment - это огромная функция, и я хотел бы перенести некоторые функции во вспомогательную функцию, например help_to_add, которая требует изменения некоторых атрибутов класса.

app.py

from flask import make_response
from modules import help_to_add
import sys

sys.path.append('..')
from untitled import app


class Main:
    def __init__(self):
        self.requests = 0

    def increment(self):
        self = help_to_add(self)


main = Main()


@app.route('/', methods=['POST'])
def hello():
    v1 = add(3, 5)
    main.increment()
    v2 = add(4, 6)
    main.increment()

    return make_response('{}, {}\n'.format(v1, v2), 200)


if __name__ == '__main__':
    app.run(port='7000', host='0.0.0.0')

modules.py

def help_to_add(object):
    object.requests += 1
    return object

_<em>init</em>_.py

from flask import Flask

app = Flask(__name__)

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

PS: Изначально я использовал global переменных, и этот файл, т.е. modules.py, действовал как файл, содержащий все вспомогательные функции. Я пытаюсь полностью изменить кодовую базу, чтобы использовать классы и полностью избегать global переменных.

1 Ответ

1 голос
/ 09 июля 2020

Лично, если вы действительно хотите разделить код для одного класса на несколько файлов (чего я бы сам не делал), я не вижу ничего плохого в шаблоне:

# In one file
from my_implementation import my_implementation

class Foo:
    def big_function_bar(self):
        my_implementation(self)

# In another file
def my_implementation(self):
    pass    # do stuff you need to do

Это будет работать должным образом. Это может немного запутать, так как вы будете прыгать по файлам, пытаясь выяснить, какой фрагмент кода куда ведет.

В этой заметке вам не нужно делать: *

Вместо этого вы можете просто сделать:

help_to_add(self)

Это потому, что объекты передаются по ссылке в Python, поэтому любые изменения, которые вы вносите в object, будут относиться к этому точному экземпляру, не его копия.

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