开发者

Python Class attributes - resetting

开发者 https://www.devze.com 2022-12-17 14:05 出处:网络
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

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)开发者_如何学C
       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


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 :)


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.


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


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.


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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号