views:

151

answers:

4

Hi Whats the best way to reset class attributes in Python.

I have a class whichs has about 20 class attributes, in my init I have

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

These need to be reset on each iteration of my program, what is the neatest way of doing this rather than setting to zero as shown above

Thanks

A: 

I'm not sure if this any more neat, but:

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

As SilentGhost suggested, you should probably put them in a sane data structure, such as tuple e.g.

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

or, you can use dictionary:

class MyClass:
    def __init__(self):
        self.data = {}
        for v in ('time', 'pos', 'vel', 'acc', 'rot', 'dyn'):
        self.data[v] = 0
Kimvais
Thanks, the example I posted uses attributes of a,b,c,d,e. I use more descriptive names in my code e.g time, pos, vel, acc, rot, dyn etc. How could I reset these
mikip
+3  A: 

I'd rather not reset them in the init method but define a reset method for this, and call reset from init and before every subsequent iteration.

jellybean
+4  A: 

you can use vars() to return a dictionary of values that you can edit.

something like that

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

if you dont want to edit some other attributes you can do something like that

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

this will not edit the variable a , although i think we have gone to far with this and we might be breaking an oop principle here :)

Ahmed Kotb
Thanks, nice solution, however there are some attributes that I dont want to reset
mikip
if they are not many then you can use if i != 'a': ....
Ahmed Kotb
+1  A: 
class MyClass(object):
  def __init__(self):
    attribs = 'time', 'pos', 'vel', 'acc', 'rot', 'dyn'
    vars(self).update((x, 0) for x in attribs)
James Hopkin