在类和函数中使用变量的最佳实践



我正在写大量的代码,对于在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__。然后我可以使用任何函数调用这些变量。

有什么更好的方法,或者有更好的方法吗?

不确定我是否完全理解你的要求,但如果我理解正确,答案是这取决于你想做什么。如果你想为整个类存储一次属性,你应该设置类的属性(如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)对于每个实例是独立的。

相关内容

  • 没有找到相关文章

最新更新