python - 在 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:人们通常如何处理硬编码大量参数以制作相似的对象?
解决方案
您可以使用包含此信息的元组列表,而不是使用三个属性来存储有关小部件的信息:
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)
}
这里的主要好处不是运行时效率,而是每个小部件定义都是自包含的。
推荐阅读
- excel - 对象变量或块变量未在 excel 宏 vba 上设置
- sql - 如果有活动日期,则以 0 重新开始行号
- typescript - 如何使用查询以及在哪里?
- python - 如何在 django 3.2 中解决 NoReverseMatch at /(模板渲染期间出错)?
- mysql - Find all linked records using self join
- apache-spark - mapPartitionsWithIndex 和 worker 索引之间的 Spark 相关性
- java - 如何识别 Azure 服务总线队列为空
- java - 尝试查询路线时出现意外错误
- python - 用 bins=0.2(分数)水平 bin 熊猫数据框,我应该怎么做?
- python - 即使我安装了 keras-efficientnets,我也无法导入 keras-efficientnet B0