2010-01-22 62 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)