Search code examples
pythonpython-3.xoopbokeh

How to design a complex Bokeh Application?


I am programming a bokeh application. I want to split the functionalities into different files. But I want to have some attributes accesible from every class, these attributes should be shared and always updated. For example an attribute which stores a dataframe that all the plots are going to use. So I think I have at least two possible solutions:

  • Use a big class and include the attributes and methods of other files:

    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
    

    Note: this solution was copied from here (partial classes)

  • Or I could use inheritance. The parent will have the shared attributes. The perk of this system is that I would need to send the rest of the object references to every subclass

    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'
    
    # [...]
    

Is there a better way to do this? Which option will bring me less problems?


Solution

  • Finally I have created an my_bokeh_app folder. There I have an __init__.py file with this content for the initialization:

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

    I have created a Class to share data among all the objects. This is the class:

    class BokehSharedData(object):
        # ------------------- CLASS VARIABLES ---------------------- #
        # This variables are shared. So all the children can access them
    
        data_source = None
    
        bk_layout = None
        bk_data = None
        bk_plot = None
        bk_table = None
        bk_events = None
    

    In every class I make a reference to the BokehSharedData class. I also inherit from that class to access to the class variables.

    from my_bokeh_app.bokeh_shared_data import BokehSharedData
    
    class BokehData(BokehSharedData):
        def __init__(self, **kwargs):
            self.env = BokehSharedData
            self.env.bk_data = self
    
            # If for example I want to access to the source attribute from the rest of objects
            # I could make this shortcut on the shared class
            self.env.data_source = ColumnDataSource(...)
    
        def update_data_source(self):
    
            # [...]
    

    And I could read the shared attributes or execute methods from other object:

    from my_bokeh_app.bokeh_shared_data import BokehSharedData
    
    class BokehPlots(BokehSharedData):
        def __init__(self, **kwargs):
            self.env = BokehSharedData
            self.env.bk_plots = self
    
            # I could use self.env.data_source here or run some method of BokehData class like this
    
            self.env.bk_data.update_data_source()
    

    The complete app where you can see all the classes working is here