在Python代码中,这是使用依赖注入的合适地方吗——如果是的话,如何

问题描述 投票:0回答:1

代码设置如下:

  • 模块 ui_theme.py 定义主题和变体选择器。
  • variant_selector 有一个 on_change 事件处理程序。
  • 模块cards_page.py导入ui_theme.py 并有一个处理程序 on_variant_change。

现在,我想要实现的目标是,当调用 ui_theme.on_change 事件时,它应该以某种方式调用 cards_page.on_variant_change 事件。

约束:我绝对不想创建一个函数来生成variant_selector。这使得代码组织有点混乱。我也无法在初始化后设置事件处理程序。

我目前的解决方案如下:

  • ui_theme.py
on_change_variant_callback = None
def on_change_variant_click(dbref, msg, to_ms):
    print ("button clicked:", msg.value)
    if on_change_variant_callback:
        on_change_variant_callback(dbref, msg, to_ms)
        
    pass
  • 在cards.py中
import ui_theme
def on_variant_select():
  pass

ui_theme.on_change_variant_callback = on_variant_select

在我看来应该有更好的方法——可能依赖注入可以提供帮助,尽管我不太理解这个概念。

python dependency-injection callback eventhandler
1个回答
0
投票

通过使用依赖注入,您可以使代码更加模块化和灵活。使用此方法,您可以从对象外部提供对象所需的组件。因此,您可以放松模块之间的紧密关系,并使您的代码更易于管理,使其更容易接受未来的更改。

在当前情况下,您已在 ui_theme.py 文件中定义了 on_change_variant_callback 函数,并在 cards_page.py 文件中为该回调函数分配了一个值。这种情况在两个文件之间建立了非常紧密的联系。

我们可以使用依赖注入来放松这种紧密的联系。也就是说,我们可以通过某种方式从外部将 on_change_variant_callback 函数传递给 ui_theme.py 模块。因此,我们减少了 ui_theme.py 和 cards_page.py 文件之间的依赖关系,使我们的代码具有更加模块化和灵活的结构。

通过这种方法,你可以更轻松地适应你的代码未来的发展,轻松适应可能的变化

ui_theme.py

class VariantSelector:
def __init__(self, on_change_callback=None):
    self.on_change_callback = on_change_callback

def on_change_variant_click(self, dbref, msg, to_ms):
    print("button clicked:", msg.value)
    if self.on_change_callback:
        self.on_change_callback(dbref, msg, to_ms)

cards_page.py

from ui_theme import VariantSelector

def on_variant_select(dbref, msg, to_ms):
# Handle the variant change event
pass

variant_selector = VariantSelector(on_change_callback=on_variant_select)
© www.soinside.com 2019 - 2024. All rights reserved.