首页 > 解决方案 > 在 Python 中有效地构造大量相似的对象

问题描述

我正在编写一个 python 库,它使用 Bokeh 生成交互式可视化。我发现自己构建了大量的小部件,并且想知道一种更有效的方式来构建我的代码。考虑以下最小示例(我正在以面向对象的方式编写,这是我的类方法之一):

from bokeh.models.widgets.buttons import Button
from bokeh.models.widgets import Slider

# ...
def _generate_widgets(self):
    """
    Generates the widget instances used for user interaction.
    """
    self.widget_names = ['start', 'change', 'do_something']
    self.widget_types = {'start':Button,
                         'change':Slider,
                         'do_something':Button}
    self.widget_args = {'start':{'label':'Start!',
                                 'width':200}},
                        'change':{'title':'Change value:',
                                  'width':200,
                                  'value':500,
                                  'start':0,
                                  'end':1000,
                                  'step':50},
                         'do_something':{'label':'Do Something!'}}
     self.widget_callbacks = {'start':self._start_callback,
                              'change':None,
                              'do_something':self_do_callback}

   # make the widgets
   self.widgets = {}
   for widget_name in self.widget_names:
        widget = self.widget_types[widget_name](**self.widget_args[widget_name])
        self.widgets[widget_name] = widget

然后我稍后分配回调。在这个小例子中它并不算太糟糕,但是当我有大量小部件(比如 5 个以上)时,存储小部件属性的字典会变得非常大,我会重复很多代码(小部件名称)。这种方法的一个优点是它允许我轻松添加/删除小部件,而不必担心字典中的顺序。但是我想知道是否有更有效的方法来写这个?

例如,我的一个想法是制作一个按钮构造函数并将信息存储在一个列表中。

TLDR:人们通常如何处理硬编码大量参数以制作相似的对象?

标签: python

解决方案


您可以使用包含此信息的元组列表,而不是使用三个属性来存储有关小部件的信息:

widget_definitions = [
    ('start', Button, { <start button kwargs> }, self._start_callback),
    ('change', Slider, { <change slider kwargs> }, None),
    ('do_something', Button, { <do something kwargs>, self._do_something)
]

或者,您可以有一个从小部件名称到其他属性的字典。

widget_definitions = {
    'start': (Button, { <start button kwargs> }, self._start_callback),
    'change': (Slider, { <change slider kwargs> }, None),
    'do_something': (Button, { <do something kwargs> }, self._do_something)
}

这里的主要好处不是运行时效率,而是每个小部件定义都是自包含的。


推荐阅读