2010-01-22 61 views
3

什么是在Python中重置类属性的最佳方式。Python类属性 - 重置

我有伟驰大约有20类属性,在我的初始化类我有

class MyClass: 
    def __init__(self) 
     self.time=0 
     self.pos=0 
     self.vel=0 
     self.acc=0 
     self.rot=0 
     self.dyn=0 

这些都需要在我的程序的每个迭代复位,什么是这么做的,而不是设置最巧妙的方法零如上图所示

感谢

+3

将它们变成列表,元组,字典或一些其他理智的数据结构? – SilentGhost 2010-01-22 09:03:47

+1

是否要重置OBJECT属性或CLASS属性?你在你的问题中说类,但你的代码似乎是你的意思是对象属性。 – Khelben 2010-01-22 09:31:55

+1

正如你所看到的,有各种丑陋的黑客将对象的所有变量设置为0.我不认为他们中的任何一个都是正确的。正确的事情更像你正在做的事情。但是如果你发布真正的代码,我们可以帮你做一些理智的事情。 – 2010-01-22 09:34:02

回答

0

我不知道这是否任何更多的整齐,但是:

class MyClass: 
    def __init__(self): 
     for v in ('time', 'pos', 'vel', 'acc', 'rot', 'dyn'): 
      exec("self.%s = 0" % v) 

正如SilentGhost的建议,你应该把它们放在一个健全的数据结构中,比如tuple

class MyClass: 
    def __init__(self): 
     self.values = 20*(0,) 

,或者您可以使用词典:

class MyClass: 
    def __init__(self): 
     self.data = {} 
     for v in ('time', 'pos', 'vel', 'acc', 'rot', 'dyn'): 
     self.data[v] = 0 
+0

谢谢,我发布的示例使用了a,b,c,d,e的属性。我在我的代码中使用了更多的描述性名称,例如time,pos,vel,acc,rot,dyn等。我怎么能重置这些 – mikip 2010-01-22 09:32:31

4

我宁愿不重置他们在init方法,但定义这个reset方法,并从init和以后每一次迭代之前调用reset

4

您可以使用vars()返回您可以编辑的值的字典。

类似的东西

class A: 
    def __init__(self): 
     self.a=1 
     self.b=1 

    def reset(self): 
     dic = vars(self) 
     for i in dic.keys(): 
      dic[i] = 0 

inst = A() 
print inst.a , inst.b # will print 1 1 
inst.reset() 
print inst.a , inst.b # will print 0 0 

如果你不想编辑一些其他属性,你可以做这样的事情

def reset(self): 
    dic = vars(self) 
    noEdit = ['a'] 
    for i in dic.keys(): 
     if i not in noEdit: 
      dic[i] = 0 

这不会修改变量,但我认为我们已经走了到此为止,我们可能会在这里打破一个oop原则:)

+0

谢谢,很好的解决方案,但是有一些属性我不想重置 – mikip 2010-01-22 09:28:17

+0

如果它们不多那么你可以使用,如果我!='a':.... – 2010-01-22 09:34:24

2
class MyClass(object): 
    def __init__(self): 
    attribs = 'time', 'pos', 'vel', 'acc', 'rot', 'dyn' 
    vars(self).update((x, 0) for x in attribs)