2012-08-31 68 views
1

我正在写大量的代码,并且我没有足够的经验介绍在python类和函数中使用变量的最佳方式,所以我想我会问对于一些意见。下面是我怎么能做到这一点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__中的变量。然后我可以使用任何函数调用这些变量。

有什么更好的方法,还是有更好的方法来做到这一点?

回答

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)对于每个实例都是独立的。

+0

好的..我想我会帮你。所以我可以使用一个对象创建很多实例。无论对象是否改变类变量,object.class变量都是相同的,但类的即时变量将独立于每个对象? – Oli