在Python中高效地构建许多相似的对象

时间:2019-05-10 11:14:59

标签: 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:人们通常如何处理大量参数的硬编码以制成相似的对象?

1 个答案:

答案 0 :(得分:1)

除了具有三个属性来存储有关小部件的信息之外,您可以使用具有以下信息的元组列表:

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)
}

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