Reputation: 1727
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
Upvotes: 5
Views: 8419
Reputation: 997
I had a similar question myself and had discovered that the best way to do it is just like Johannes Charra suggested:
class MyClass:
def __init__(self):
self.reset()
def reset(self):
self.acc = 0
self.dyn = 0
self.pos = 0
self.rot = 0
self.vel = 0
self.time = 0
Now you have a reset()
method which you can call on an instance of MyClass
whenever you want to reset all those attributes.
Upvotes: 1
Reputation: 13973
class MyClass(object):
def __init__(self):
attribs = 'time', 'pos', 'vel', 'acc', 'rot', 'dyn'
vars(self).update((x, 0) for x in attribs)
Upvotes: 2
Reputation: 29953
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.
Upvotes: 4
Reputation: 39638
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
Upvotes: 0
Reputation: 6307
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 :)
Upvotes: 4