我正在编写大量的代码,而且我没有足够的经验在python类及其函数中使用变量的最佳方法,所以我想我会要求一些意见。这是我如何做到的一个例子
class MyClass():
vara = 'Class Variable A'
def __init__(self):
self.varb = 'Class instantiation Variable B'
def a(self):
varc = 2
vard = 3
print 'def a function variables unchanged', varc, vard
MyClass.vara = 'Class Variable A now changed by def a'
def b(self):
print self.varb
self.varb = 'Class instantiation Variable B now changed by def b'
print self.varb
if __name__ == "__main__":
print MyClass.vara
a = MyClass()
a.a()
a.b()
print MyClass.vara
a.a()
这给出了这个结果
Class Variable A
def a function variables unchanged 2 3
Class instantiation Variable B
Class instantiation Variable B now changed by def b
Class Variable A now changed by def a
def a function variables unchanged 2 3
我在django的应用程序正在使用一个具有大约25个函数的类。它是一个测试应用程序,每个函数代表一个API调用。每个API调用都会根据结果给出一些变量,我需要由其他函数使用的函数设置这些变量 - 换句话说,我需要通过其他函数调用这些局部函数变量。我想知道最好的方法。
在上面的例子中,我可以使用类中的函数设置类变量vara,通过这样做MyClass.vara = 'something'
或者我可以设置实例化构造函数__init__
中的变量。然后我可以使用任何函数调用这些变量。
有什么更好的方法,还是有更好的方法来做到这一点?
答案 0 :(得分:4)
不确定我是否完全得到你所要求的,但如果我理解正确,那么答案就是它取决于你想做什么。您应该在类上设置属性(如在vara
中),如果您希望为整个类存储一次。如果您想为每个实例添加单独的属性,则应在__init__
中的实例上设置它(如在varb
中)。
如果您有一个可变对象(如列表)作为属性的值,则差异会变得更清晰。见下文:
>>> class Foo(object):
... classVar = []
... def __init__(self):
... self.instVar = []
>>> f = Foo()
>>> g = Foo()
>>> f.classVar
[]
>>> f.instVar
[]
>>> g.classVar
[]
>>> g.instVar
[]
>>> f.instVar.append(1)
>>> f.instVar
[1]
>>> g.instVar
[]
>>> f.classVar.append(1)
>>> f.classVar
[1]
>>> g.classVar
[1]
请注意,在最后一位,变异f.classVar
也影响了g.classVar
。因为这是一个类属性,所以它在类的所有实例之间共享。实例属性(instVar
)对于每个实例都是独立的。