Атрибуты класса Python - сброс - PullRequest
3 голосов
/ 22 января 2010

Каков наилучший способ сброса атрибутов класса в Python.

У меня есть класс, который имеет около 20 атрибутов класса, в моем init у меня есть

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

Их нужно сбрасывать на каждой итерации моей программы, что является лучшим способом сделать это, а не устанавливать его на ноль, как показано выше

Спасибо

Ответы [ 4 ]

4 голосов
/ 22 января 2010

Я бы предпочел не сбрасывать их в методе init, а определить для этого метод reset и вызывать reset из init и перед каждой последующей итерацией.

4 голосов
/ 22 января 2010

вы можете использовать vars (), чтобы вернуть словарь значений, которые вы можете редактировать.

что-то в этом роде

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

если вы не хотите редактировать некоторые другие атрибуты, вы можете сделать что-то подобное

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

это не будет редактировать переменную a, хотя я думаю, что мы далеко продвинулись с этим, и мы могли бы нарушить принцип oOp здесь

2 голосов
/ 22 января 2010
class MyClass(object):
  def __init__(self):
    attribs = 'time', 'pos', 'vel', 'acc', 'rot', 'dyn'
    vars(self).update((x, 0) for x in attribs)
0 голосов
/ 22 января 2010

Я не уверен, что это более аккуратно, но:

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

Как предположил SilentGhost, вам, вероятно, следует поместить их в разумную структуру данных, например, tuple, например

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

или, вы можете использовать словарь:

class MyClass:
    def __init__(self):
        self.data = {}
        for v in ('time', 'pos', 'vel', 'acc', 'rot', 'dyn'):
        self.data[v] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...