[英]How to use a class attribute instead of a global variable?
我想拥有一个对许多函数通用的变量,所以我考虑使用全局变量,但我发现这是一个坏主意,并且最好与类一起使用,因此我想我们应该使用类属性?
真正的问题是如何从依赖全局变量的程序转到使用类属性的程序?
比方说,我有以下内容:
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
这是一个好的开始吗?
关于为什么全局性在Python中如此邪恶的利弊,我将带您参考以下页面,我在不久前研究此内容时就使用了该页面:
我发现有趣的是,我在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
因此,现在我们要更改MyClass
的my_variable
部分的值,因此可以执行此操作。 您可以为此使用与全局变量相同的函数样式。 只需注意,为了将my_variable
重新分配给my_variable
中的新值,在引用它时需要使用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
变量,但是我们如何使用它呢? 首先,假设您的类MyClass
存储在名为my_class.py
的文件中。 以Flask方法为例,现在执行以下操作:
from my_class import MyClass
@app.route('/'):
myClass = MyClass()
myClass.function1()
myClass.function2()
return myClass.my_variable
这将完全按照您的需要工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.