Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用外部/辅助文件(即模块)修改类属性(self)的最佳方法是什么?_Python_Python 3.x_Oop_Flask_Optimization - Fatal编程技术网

在Python中使用外部/辅助文件(即模块)修改类属性(self)的最佳方法是什么?

在Python中使用外部/辅助文件(即模块)修改类属性(self)的最佳方法是什么?,python,python-3.x,oop,flask,optimization,Python,Python 3.x,Oop,Flask,Optimization,我有一个Flask应用程序,它越来越大,我想把一些类函数移到一个外部文件中,因为该文件超过500行。这些函数具有一些修改某些类属性的逻辑,并且很大(就行而言) 下面是一个演示场景,我试图跟踪请求的数量。让我们假设increment是一个巨大的函数,我想将一些功能移动到一个helper函数,即help\u添加,这需要修改一些类属性 app.py from flask import make_response from modules import help_to_add import sys s

我有一个
Flask
应用程序,它越来越大,我想把一些类函数移到一个外部文件中,因为该文件超过500行。这些函数具有一些修改某些类属性的逻辑,并且很大(就行而言)

下面是一个演示场景,我试图跟踪请求的数量。让我们假设
increment
是一个巨大的函数,我想将一些功能移动到一个helper函数,即
help\u添加
,这需要修改一些类属性

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')
def help_to_add(object):
    object.requests += 1
    return object
from flask import Flask

app = Flask(__name__)
modules.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')
def help_to_add(object):
    object.requests += 1
    return object
from flask import Flask

app = Flask(__name__)
\u init\uupy.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')
def help_to_add(object):
    object.requests += 1
    return object
from flask import Flask

app = Flask(__name__)
现在,我通过将
self
作为一个参数传递来实现这一点,但在我看来它不是很干净。我想知道是否有更好的方法来做到这一点。我知道,理想情况下,我们应该在类下的同一个文件中有这个函数(
help\u to\u add
),我应该尝试将静态方法移动到一个helper函数并重新组织代码。我已经完成了所有这些,但是我有很多函数需要读取/修改类属性,并且我必须将其中的一些移动到一个单独的模块中

PS:最初,我使用的是
global
变量,这个文件即
modules.py
充当一个包含所有helper函数的文件。我试图将整个代码库转换为使用类,并完全避免使用
全局
变量。

就我个人而言,如果您真的想将一个类的代码拆分为多个文件(我自己不会这么做),我认为以下模式没有任何错误:

#在一个文件中
从my_实现导入my_实现
Foo类:
def大功能条(自身):
my_实现(自我)
#在另一个文件中
定义我的_实现(自我):
通过#做你需要做的事情
这将如预期的那样起作用。这可能会使事情变得有点混乱,因为您将在文件中四处跳跃,试图找出哪一段代码将导致哪里

在这一点上,您不需要执行以下操作:

self=帮助添加(self)
相反,您可以简单地执行以下操作:

帮助添加(自我)

这是因为在Python中对象是通过引用传递的,所以对
对象所做的任何更改都将针对该实例,而不是它的副本。

为了澄清这一点,您基本上需要一个跨多个文件的类定义?是的,您可以说,在Python中,通常不需要这样做。如果您认为一个类变得太大,您可能会评估它为什么变得如此大,以及您可以用它做些什么,例如删除重复代码和为不同的逻辑片段使用多个单独的类。但在Python中,您不会将一个类拆分为多个文件。但是,对于初学者来说,您可以将该类放在自己的文件中,与其他文件分开,这是正常的。感谢您的澄清。我想知道这是不是一个好的做法。只是澄清一下,所有需要修改属性的函数都应该属于同一个类/文件。如果可能的话,所有要求类属性为只读(一次性初始化)的函数也应该是同一个类的一部分,但将它们放在帮助文件中并没有坏处。应将静态方法移动到辅助文件以减小文件大小。是吗?这些可能比什么都重要。将参数传递给函数本身并没有什么错,但我认为,如果函数经常作用于那个“自我”对象,那么它可能应该被定义为该类的一部分,即使这会带来更大的生命。不过,这更像是一种风格偏好。我倾向于选择直观的代码现场查找,即使文件因此变得更大。前半部分正是我现在正在做的,并在我的问题中提到过。然而,第二部分是有用的。如果它是通过引用传递的,那么我也不必从helper函数返回任何内容。谢谢