0

嗨,我试图通过这样做来节省一些打字并变得“聪明”......

class foo(object):
    def __init__()
        self.eric = 0
        self.john = 0
        self.michael = 0
        self.switchdict = {'Eric':self.eric, 'John':self.john, 'Michael':self.michael}

    def update(self, whattoupdate, value):
       if whattoupdate in self.switchdict:
           self.switchdict[whattoupdate] += value

在它不起作用之后,很明显整数值不是通过引用传递的,而是作为整数传递的。通过将属性转换为列表,我采取了长期的解决方法,但我怀疑有更好的方法。

我实际上有大约 30 个这样的属性,所以保存输入并将它们添加到列表中非常方便,但我的 google-fu 并没有产生任何令人满意的方法来做到这一点。

任何聪明但仍然可读和 Pythonic 的建议?

4

1 回答 1

1

恭喜!你只是重新发明了一种有限的setattr(). :-)

如果您在这条路上走得很远,我认为您将面临维护的噩梦,但如果您坚持,我会考虑类似的事情:

class foo(object):
    allowedattrs = ['eric', 'john', 'michael']

    def __init__(self):
        self.eric = 0
        self.john = 0
        self.michael = 0
        self.switchdict = {'Eric':self.eric, 'John':self.john, 'Michael':self.michael}

    def update(self, whattoupdate, value):
        key = whattoupdate.lower()
        if key not in self.allowedattrs:
            raise AttributeError(whattoupdate)
        setattr(self, key, getattr(self, key) + value)

f = foo()
f.update('john', 5)
f.update('john', 4)
print f.john

但是将您的值存储在 nice 中真的会容易得多defaultdict吗?

from collections import defaultdict

class foo(object):
    allowedattrs = ['eric', 'john', 'michael']

    def __init__(self):
        self.values = defaultdict(int)

    def update(self, whattoupdate, value):
        self.values[whattoupdate] += value

f = foo()
f.update('john', 5)
f.update('john', 4)
print f.values['john']
于 2012-10-16T23:39:32.163 回答