mikip
mikip

Reputation: 1727

Python Class attributes - resetting

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

Answers (5)

Boštjan Mejak
Boštjan Mejak

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

James Hopkin
James Hopkin

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

Johannes Charra
Johannes Charra

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

Kimvais
Kimvais

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

Ahmed Kotb
Ahmed Kotb

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

Related Questions