Python类属性 - 重置

5

什么是在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

每次程序迭代时都需要重置这些值,除了上面所示的设置为零的方法之外,还有什么更简洁的方法可以实现呢?

谢谢。


3
把它们转换成列表、元组、字典或其他合理的数据结构? - SilentGhost
1
你想重置对象属性还是类属性?你在问题中提到了类,但根据你的代码似乎是指对象属性。 - Khelben
1
正如您所看到的,有各种各样的丑陋解决方案可以将对象的所有变量设为0。我认为它们中没有任何一种是正确的做法。正确的方法更类似于您正在做的事情。但是如果您发布真实的代码,我们可以帮助您做一些明智的事情。 - Lennart Regebro
1
为什么要清除一个已经存在的对象?这似乎完全是错误的。 - S.Lott
@Lennart 丑陋的黑科技?即便是黑科技在 Python 中也是漂亮的;-) - James Hopkin
5个回答

4
你可以使用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原则 :)

谢谢,不错的解决方案,但是有一些属性我不想重置。 - mikip

4

我宁愿不在init方法中重置它们,而是为此定义一个reset方法,并在每次迭代之前从initreset方法调用reset


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

1

我自己也有类似的问题,并发现像Johannes Charra建议的那样做是最好的方式:

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

现在你有一个reset()方法,可以在任何时候调用MyClass的实例来重置所有这些属性。

0

我不确定这是否更整洁,但是:

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

正如SilentGhost所建议的那样,你应该将它们放在一个合理的数据结构中,例如元组。
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

谢谢,我发布的示例使用了a、b、c、d、e等属性。在我的代码中,我使用更具描述性的名称,例如time、pos、vel、acc、rot、dyn等。我该如何重置它们? - mikip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接