0

编辑:最初的问题涉及 PyQt 和 matplotlib,真正的问题太复杂而无法解释,所以我试图简化它,但并没有真正解决。但从回复中我了解到实际问题可能出在我最初认为的其他地方。我想这就是学习编程的意义所在。

谢谢大家!


我正面临一个困扰我的风格问题。我试图尽可能笼统地对他人有所帮助。考虑以下类:

class Values(object):
    def __init__(self):
        self.first_attr = None
        self.second_attr = None
        self.third_attr = None
        self.fourth_attr = None

    def set_first(self, data):
        self.first_attr = data

    def set_second(self, data):
        self.second_attr = data

    def set_third(self, data):
        self.third_attr = data

    def set_fourth(self, data):
        self.fourth_attr = data

    def add_to_three(self):
        attrs = (
                 self.first_attr,
                 self.second_attr,
                 self.third_attr,
                 )
        self._add_one(attrs)

    def add_to_two(self):
        attrs = (
                 self.second_attr,
                 self.fourth_attr,
                 )

        self._add_one(attrs)

    def _add_one(self, attrs):
        for attr in attrs:
            if attr:
                attr += 1

我们有一类价值观。该类总共可以有 4 个不同值的属性。每个值都可以用一个 setter 设置(没有使用装饰器来简化事情)。

还有两种方法具有属性元组,其值应该增加。这些值是在运行时间之前确定的。

我们还有一个方法“add_one”,如果设置了这些属性,它会向它接收的那些属性添加一个。否则什么都不应该发生。

现在让我们创建几个实例并设置一些值

first_values = Values()
first_values.set_second = 5

first_values.add_to_three()

second_values = Values()
second_values.set_first = 2
second_values.set_third = 4

second_values.add_to_two()

这很好用,因为“add_one”方法检查是否设置了每个属性。

但是如果我有 50 个属性呢?我不喜欢将它们全部设置为无的想法。另外,我不喜欢在那些 add_to_ 方法中显式编写元组的想法。

如果仅通过更改 Values 类有很多属性,那么处理此问题的最合适方法是什么?

4

2 回答 2

0

此代码应该允许您创建具有一组开放属性的对象,包括作为元组的属性,然后增加它们的内容。

class Values():
    def __init__(self, *attrs):
        '''each element in attrs is a tuple(attrname, value)'''
        if attrs is not None:
            for a in attrs:
                n, v = a
                setattr(self, n, v)

    def add_one(self, attr):
        a = getattr(self, attr, None)
        if a:
            if isinstance(a, tuple):
                setattr(self, attr, tuple(e + 1 for e in a))
            else:
                setattr(self, attr, a + 1)

v = Values(('x', 1), ('y', 2), ('z', 3), ('t', (7, 8, 9)))
print('Initial values:', v.x, v.y, v.z, v.t)
v.add_one('x')
print('X modified:', v.x, v.y, v.z, v.t)
v.add_one('t')
print('T modified:', v.x, v.y, v.z, v.t)
v.add_one('a')
print('Tried to modify non-existent attribute "a"', v.x, v.y, v.z, v.t)

结果:

>>> import attr
Initial values: 1 2 3 (7, 8, 9)
X modified: 2 2 3 (7, 8, 9)
T modified: 2 2 3 (8, 9, 10)
Tried to modify non-existent attribute "a" 2 2 3 (8, 9, 10)
>>> 

此代码将允许您动态创建对象,每个实例包含可能大量可能属性的子集,并操作每个实例的属性。

于 2013-07-30T18:03:55.590 回答
0

我想你想要一本字典

data = {'two': 4}
attrs = ['one','two','three']
for attr in attrs:
    if data.has_key(attr):
        data[attr] += 1
    else:
        data[attr] = 1 # this assumes all new attributes had an effective value of zero when they didn't exist
        # it seems like you want nonesxistant attributes to remain nonexistant
        # so just remove the else case
于 2013-07-30T19:23:07.793 回答