Python Class attributes - resetting

2019-02-18 18:25发布

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

4条回答
叼着烟拽天下
2楼-- · 2019-02-18 18:39

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.

查看更多
疯言疯语
3楼-- · 2019-02-18 18:45
class MyClass(object):
  def __init__(self):
    attribs = 'time', 'pos', 'vel', 'acc', 'rot', 'dyn'
    vars(self).update((x, 0) for x in attribs)
查看更多
聊天终结者
4楼-- · 2019-02-18 18:52

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

查看更多
闹够了就滚
5楼-- · 2019-02-18 18:52

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
查看更多
登录 后发表回答