如何使用类属性而不是全局变量?

时间:2017-11-27 12:52:38

标签: python flask

我想有一个很多函数共有的变量,所以我考虑使用全局变量,但是我发现这是一个坏主意,并且最好使用一个类,所以我想我们应该使用一个类属性?

真正的问题是如何从依赖全局变量的程序转到使用类属性的程序?

比方说,我有以下内容:

function.py

my_variable = []

def function1():
    global my_variable
    #then we do something on my_variable
def function2():
    global my_variable
    #then we do something on my_variable

views.py(在烧瓶中):

from function import my_variable
@app.route('/'):
    global my_variable 
    function1()
    function2()
    return my_variable 

我想在课堂上我们会为function.py提供类似的内容吗?

class Function:

    my_variable = []
    def __init__(self, variable):
        Function.my_variable = variable
    def function1(self):
    #we do something on Function.my_variable
    def function2(self):
    #we do something on Function.my_variable

这是一个好的开始吗?

1 个答案:

答案 0 :(得分:0)

关于为什么全局在Python中是如此邪恶的专业人士和概念,我将引用你以下的页面,我在前一段时间研究这个问题时用过自己:< / p>

Why are global variables evil?

我感到有趣的是,我在Visual Studio Code(我选择的IDE)中使用Python linter,并且这个linter 始终突出显示全局变量即使正确实现也是一个问题。在linter错误和我分享的链接中的建议之间,我遵循了您已经提到的相同规则。在Python中使用变量而不是全局变量。

至于如何将全局变量转换为类变量?这很简单。

所以你上面提到的是一个模块,你宣布你的my_variable并将其初始化为空列表。所以在课堂上,你可以做同样的事情:

class MyClass:

    def __init__(self):
        self.my_variable = []

或者,如果要在实例化此类的实例时直接将值赋给变量,还可以执行以下操作:

class MyClass:

    def __init__(self, my_variable):
        self.my_variable = my_variable

现在您可以使用:

创建MyClass的实例
myClass = MyClass() #For the first example OR
myClass = MyClass([]) #For the second example

现在我们要更改my_variable的{​​{1}}部分的值,以便我们这样做。您可以使用与您习惯的全局变量相同的函数样式。请注意,为了将MyClass重新分配给班级中的新值,您需要在引用它时使用my_variable关键字,因为它现在属于{{1} },如下:

self

所以你的整个class现在看起来像这样:

def function1(self):
    self.my_variable = #Change the value of my_variable

def function2(self):
    self.my_variable = #Change the value of my_variable again

现在您已将class变量转换为class MyClass: def __init__(self): self.my_variable = [] def function1(self): self.my_variable = #Change the value of my_variable def function2(self): self.my_variable = #Change the value of my_variable again 变量,但我们如何使用它?首先,假设您的班级global存储在名为class的文件中。通过Flask方法示例,您现在可以执行以下操作:

MyClass

这将完全按照你的需要工作!