Python 如何设计复杂的Bokeh应用程序?

Python 如何设计复杂的Bokeh应用程序?,python,python-3.x,oop,bokeh,Python,Python 3.x,Oop,Bokeh,我正在编写一个bokeh应用程序。我想把这些功能分成不同的文件。但是我想让每个类都可以访问一些属性,这些属性应该被共享并总是更新。例如,存储所有绘图将要使用的数据帧的属性。因此,我认为我至少有两种可能的解决方案: 使用大类并包含其他文件的属性和方法: class Bigclass(object): from bk_plots import p1, p2, p3 from bk_data import d1, d2, d3 from bk_layout import l

我正在编写一个bokeh应用程序。我想把这些功能分成不同的文件。但是我想让每个类都可以访问一些属性,这些属性应该被共享并总是更新。例如,存储所有绘图将要使用的数据帧的属性。因此,我认为我至少有两种可能的解决方案:

  • 使用大类并包含其他文件的属性和方法:

    class Bigclass(object):
    
        from bk_plots import p1, p2, p3
        from bk_data import d1, d2, d3
        from bk_layout import ly1, ly2
        from bk_events import ev1, ev2
        # unfortunately, "from classdefn import *" is an error or warning
    
        num = 42   # add more members here if you like
    
    注意:此解决方案是从

  • 或者我可以使用继承。父对象将具有共享属性。这个系统的好处是我需要将其余的对象引用发送到每个子类

    class Parent():
        shared = 'parent'
    
    class Plot(Parent):
        def __init__(self):
            Parent.shared = 'plots'   # update class variable from this class
                                    # I would need to have references to the objects of other classes
    
    class Data(Parent):
        def __init__(self):
            Parent.shared = 'second'
    
    # [...]
    

有更好的方法吗?哪个选项会给我带来更少的问题?

最后,我创建了一个
my_bokeh_app
文件夹。在那里,我有一个
\uuuu init\uuuuu.py
文件,其中包含以下初始化内容:

from my_bokeh_app.bokeh_data import BokehData
from my_bokeh_app.bokeh_plots import BokehPlots
from my_bokeh_app.bokeh_table import BokehDataTable
from my_bokeh_app.bokeh_events import BokehEvents
from my_bokeh_app.bokeh_layout import BokehLayout

BokehData()
BokehPlots()
BokehDataTable()
BokehEvents()
BokehLayout()
我创建了一个类来在所有对象之间共享数据。这是一节课:

类BokehSharedData(对象):
#--------------类变量------------------#
#这些变量是共享的。这样所有的孩子都可以访问它们
数据源=无
bk_布局=无
bk_数据=无
bk_图=无
bk_表=无
bk_事件=无
在每个类中,我都引用
BokehSharedData
类。我还从该类继承以访问类变量

从my_bokeh_app.bokeh_shared_数据导入BokehSharedData
类别BokehData(Bokehsharedata):
定义初始(自我,**kwargs):
self.env=BokehSharedData
self.env.bk_data=self
#例如,如果我想从其他对象访问源属性
#我可以在共享类上创建此快捷方式
self.env.data_source=ColumnDataSource(…)
def更新数据源(自身):
# [...]
我可以从其他对象读取共享属性或执行方法:

从my_bokeh_app.bokeh_shared_数据导入BokehSharedData
类别BokehPlots(BOKEHSHAREDATA):
定义初始(自我,**kwargs):
self.env=BokehSharedData
self.env.bk_图=self
#我可以在这里使用self.env.data_source,或者像这样运行BokehData类的一些方法
self.env.bk_data.update_data_source()

在一个案例中,我所做的是创建一个数据类,该类将保存数据帧并具有操作/更新数据帧的方法,然后创建一个或多个将传递给该数据对象的绘图类。在我的例子中,plot对象将是打印的对象(静态或使用两种不同方法的服务器),但它也可以返回bokeh plot对象,以便在组装应用程序时进一步使用。谢谢你的观点。因此,在您的例子中,如果已经绘制了绘图,您仍然可以更新数据,因为您可以在plot类中调用数据对象的方法,对吗?与我的第二个选项类似,但也发送数据对象引用并避免父对象。我已经回答了我自己的问题@Alex。看一看,你是从控制台运行的吗?你有最简单的例子吗?@MohamedIbrahim答案中的代码本身不起作用。我写这篇文章只是为了给你一个想法。按照这个例子,我做的整个项目是。检查我把所有的博克类都放在哪里了,尽管我一直保存着很多东西。我真的不知道这是否是最好的方法,但我没有找到其他更好的方法