优化python代码以使用对象名称

时间:2012-01-21 00:02:31

标签: python

我有一个包含16个正方形的pygtk表,每个正方形包含一个标签。标签名称为:label1,label2,label3,...,label16。

我还有一个计时器可以触发每个 n 秒。当计时器被触发时,其中一个方块被突出显示(只需将其字体大小设置为18,将其余字体大小设置为12)。

如果只有3个标签,代码将是这样的:

def update_grid(self):
    if self.timer_id is not None:
        self.__actual_choice = (self.__actual_choice % 16)+1
        if self.__actual_choice == 1:
            self.label1.modify_font(self.__font_big)
            self.label2.modify_font(self.__font_small)
            self.label3.modify_font(self.__font_small)
        elif self.__actual_choice == 2:
            self.label1.modify_font(self.__font_small)
            self.label2.modify_font(self.__font_big)
            self.label3.modify_font(self.__font_small)
        elif self.__actual_choice == 3:
            self.label1.modify_font(self.__font_small)
            self.label2.modify_font(self.__font_small)
            self.label3.modify_font(self.__font_big)

但是有16个标签,代码会很大。我想知道在python中是否有办法做类似的事情:

            self.(label+"i").modify_font(self.__font_small)

4 个答案:

答案 0 :(得分:6)

可以使用其他人建议的内置函数getattr()

label = getattr(self, 'label%d' % i)
label.modify_font(self.__font_small)

但实际上,您最好将label存储在list中。最后有很多带数字的变量是可怕的code smell

for index, label in enumerate(self.labels):
    if index == self.__actual_choice:
        label.modify_font(self.__font_big)
    else:
        label.modify_font(self.__font_small)

答案 1 :(得分:2)

您应该查看getattr函数。

答案 2 :(得分:2)

使用getattr

self.__actual_choice = (self.__actual_choice % 16)+1
for i in range(1, 17):
    if i == self.__actual_choice:
        getattr(self, 'label' + str(i)).modify_font(self.__font_big)
    else:
        getattr(self, 'label' + str(i)).modify_font(self.__font_small)

答案 3 :(得分:1)

为什么在世界上你会把它写成一堆if语句?

modify_fonts = [getattr(self, "label%s" % i).modify_font for i in xrange(1, 17)]

您现在有一个可以为每个标签调用的方法列表。也就是说,modify_fonts[0]self.label1.modify_font,依此类推。然后你循环调用它们。

actual_choice = (self.__actual_choice % 16)   # no +1, we're zero-based
for index, modify_font in enumerate(modify_fonts):
    modify_font(self.__font_big if index == actual_choice else self.__font_small)