2010-01-22 3 views
3

Каков наилучший способ сбросить атрибуты класса в Python.Атрибуты класса Python - сброс

У меня есть класс whichs имеет около 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

+1

Вы хотите сбросить атрибуты OBJECT или атрибуты CLASS? Вы говорите класс в своем вопросе, но, по вашему коду, вы имеете в виду атрибуты объекта. – Khelben

+1

Как вы видите, существуют различные уродливые хаки, чтобы установить все переменные объекта на 0. Я не думаю, что они были правильными. Правильная вещь больше похожа на то, что вы делаете. Но если вы разместите реальный код, мы можем помочь вам сделать что-то здравомыслящее. –

ответ

0

Я не уверен, если это уже не в чистом виде, но:

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

Как предложил SilentGhost, вы должны, вероятно, поместить их в разумную структуру данных, например, кортеж, например.

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

4

Я предпочел бы не сбросить их в методе init но определить метод reset для этого, и вызовите reset из init и перед каждой последующей итерации ,

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

+0

, если их не так много то вы можете использовать if i! = 'a': .... –

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