在 Python 中实现事件处理程序 [重复]

     2023-02-23     127

关键词:

【中文标题】在 Python 中实现事件处理程序 [重复]【英文标题】:Implementing event handlers in Python [duplicate] 【发布时间】:2019-09-16 16:23:41 【问题描述】:

我正在寻找如何实现具有可重写事件处理程序的对象的方法。

这是一个我想调整以使其正常工作的非工作代码:

class Button(object):
  def __init__(self, id):
    self.id = id
    pass
  def trigger_on_press(self):
    self.on_press()
  def trigger_on_release(self):
    self.on_release()
  def on_press(self):
    # empty handler
    print("Just an empty on_press handler from id=%s" % self.id)
    pass
  def on_release(self):
    # empty handler
    print("Just an empty on_release handler from id=%s" % self.id)
    pass

btn = Button("btn")
btn.trigger_on_press()

def custom_handler(self):
  print("Event from id=%s" % self.id)

btn.on_press = custom_handler
btn.trigger_on_press()

如何覆盖该特定实例的默认空 on_press 方法,以便正确传递 self 引用?

【问题讨论】:

pass 语句没用 【参考方案1】:

我建议采用这样的方法:您直接拥有一个属性(在本例中为 func_on_press),该属性包含对函数(而不是方法)的引用。该函数接收一个作为对象的参数(我将其称为 obj 而不是 self 以表明它是一个函数)。

def default_empty_event_handler(obj):
    print('empty handler for id='.format(obj.the_id))

class Button:
    def __init__(self, the_id):
        self.the_id = the_id
        self.func_on_press = default_empty_event_handler
        self.func_on_release = default_empty_event_handler

    def trigger_on_press(self):
        self.func_on_press(self)    # we pass 'self' as argument to the function

    def trigger_on_release(self):
        self.func_on_release(self)  # we pass 'self' as argument to the function

现在您可以随时更改该属性:

btn = Button('btn')
print('first trigger')
btn.trigger_on_press()

def custom_handler(obj):
    print('custom handler for id='.format(obj.the_id))

btn.func_on_press = custom_handler
print('second trigger')
btn.trigger_on_press()

这将给出以下输出:

first trigger
empty handler for id=btn
second trigger
custom handler for id=btn

在我看来,这大大减少了类的代码(您定义的方法更少)并且易于理解。这对你有用吗?

【讨论】:

谢谢,这很好用,但是@Sanyash 引用的重复问题让我更感兴趣。将事件方法调用为普通方法感觉更自然,特别是如果我直接从实例变量中调用它们。【参考方案2】:

关键是在新分配中使用类名而不是对象

btn.on_press = custom_handler 更改为 Button.on_press = custom_handler 并神奇地工作

解释:

当你调用btn.on_press()时,它会被翻译成原来的'Button.on_press(btn)'调用,所以你需要改变蓝图中的调用而不是对象

你的例子:

class Button(object):
  def __init__(self, id):
    self.id = id
    pass
  def trigger_on_press(self):
    self.on_press()
  def trigger_on_release(self):
    self.on_release()
  def on_press(self):
    # empty handler
    print("Just an empty on_press handler from id=%s" % self.id)
    pass
  def on_release(self):
    # empty handler
    print("Just an empty on_release handler from id=%s" % self.id)
    pass

btn = Button("btn")
btn.trigger_on_press()

def custom_handler(self):
  print("Event from id=%s" % self.id)

Button.on_press = custom_handler  # here use the class name not obj name
btn.trigger_on_press()

输出:

Just an empty on_press handler from id=btn
Event from id=btn

【讨论】:

这种方法覆盖了所有实例的类方法。将btx = Button("btx"); btx.trigger_on_press()添加到代码中,您会看到它已经被破坏了。

在 C# 中实现 IDisposable [重复]

】在C#中实现IDisposable[重复]【英文标题】:ImplementingIDisposableinC#[duplicate]【发布时间】:2017-01-2123:46:36【问题描述】:我正在尝试在示例程序中实现IDisposable。如果我在using块语句中使用SqlConnection类,它会自动处理它。publicinttestC... 查看详情

使用消息传递接口在 Python 中实现多处理 [关闭]

】使用消息传递接口在Python中实现多处理[关闭]【英文标题】:ImplementmultiprocessinginPythonwithamessagepassinginterface[closed]【发布时间】:2021-03-1204:49:55【问题描述】:我正在尝试将一些JavaScript代码转换为Python,但是JavaScript以异步方式... 查看详情

如何在python中实现一个好的__hash__函数[重复]

】如何在python中实现一个好的__hash__函数[重复]【英文标题】:Howtoimplementagood__hash__functioninpython[duplicate]【发布时间】:2011-04-2915:38:50【问题描述】:在实现具有多个属性的类时(如下面的玩具示例),处理散列的最佳方法是什... 查看详情

如何在 Python 3 和 PyQt5 中实现多核处理?

】如何在Python3和PyQt5中实现多核处理?【英文标题】:HowtoimplementmulticoreprocessinginPython3andPyQt5?【发布时间】:2015-03-2721:56:52【问题描述】:背景:我正在尝试在python3.4PyQT5应用程序中实现多核处理。在我有numpy.ndarrays帧的应用程... 查看详情

在 vega-lite 中实现自定义点击处理程序的正确方法是啥

】在vega-lite中实现自定义点击处理程序的正确方法是啥【英文标题】:What\'stheproperwaytoimplementacustomclickhandlerinvega-lite在vega-lite中实现自定义点击处理程序的正确方法是什么【发布时间】:2020-01-0213:43:47【问题描述】:我似乎无法... 查看详情

在 Python 中实现 Freshsales API [重复]

】在Python中实现FreshsalesAPI[重复]【英文标题】:ImplementingFreshsalesAPIinPython[duplicate]【发布时间】:2019-06-1504:41:06【问题描述】:我正在尝试将Freshsales功能集成到我的Django服务器中,以便创建潜在客户、安排约会等。但是,Freshsale... 查看详情

在C程序中实现楼梯[重复]

】在C程序中实现楼梯[重复]【英文标题】:ImplementingastaircasewithinaCprogram[duplicate]【发布时间】:2021-12-1805:59:19【问题描述】:我刚开始使用C编程,在实现一个提供“高度”数量的楼梯的程序时遇到了一些困难。#include<cs50.h>#... 查看详情

在下面所述的代码中实现错误处理时需要帮助[重复]

】在下面所述的代码中实现错误处理时需要帮助[重复]【英文标题】:Needhelpinimplementingerrorhandlingincodestatedbelow[duplicate]【发布时间】:2021-02-2719:14:29【问题描述】:我编写了一个代码,用于收集学生的作业/考试结果并将其放入学... 查看详情

在 pyqt 小部件中实现 pyqtgraph 多处理

...时间】:2013-06-2917:27:34【问题描述】:我正在尝试在我用Python设计的GUI上绘制图像。完整的程序将从相机收集图像数据,然后在GUI上显示图像。我已经探索过使用matplotlib,但它对我的应用程序来说太慢了。我需要情节更新得相... 查看详情

在 WPF 应用程序中实现 MVVM 模式、方法

】在WPF应用程序中实现MVVM模式、方法【英文标题】:ImplementingMVVMpatterninWPFapplication,methods【发布时间】:2018-04-1306:41:00【问题描述】:如何重构以下事件处理程序以适应ViewModel?privatevoidimgSkipBack_MouseDown(objectsender,MouseButtonEventArgs... 查看详情

在android应用程序中实现MVC架构[重复]

】在android应用程序中实现MVC架构[重复]【英文标题】:ImplementingMVCarchitectureinanandroidapplication[duplicate]【发布时间】:2013-12-2714:53:33【问题描述】:我想为Android应用程序实现MVC架构。有没有可能这样做。还是默认实现的。【问题... 查看详情

在 Python 中实现“规则引擎”

】在Python中实现“规则引擎”【英文标题】:Implementinga"rulesengine"inPython【发布时间】:2010-10-0220:04:32【问题描述】:我正在用Python编写一个日志收集/分析应用程序,我需要编写一个“规则引擎”来匹配和处理日志消息。... 查看详情

如何在 DHTMLX 调度程序中实用地添加重复事件?

】如何在DHTMLX调度程序中实用地添加重复事件?【英文标题】:HowtoaddrecurringeventspragmaticallyinDHTMLXScheduler?【发布时间】:2018-08-0717:42:00【问题描述】:我想将此活动添加到我的日历中leteventID=scheduler.addEvent(start_date:"2018-03-0310:00:00... 查看详情

在 Android M 中实现新权限 [重复]

】在AndroidM中实现新权限[重复]【英文标题】:ImplementingnewpermissioninAndroidM[duplicate]【发布时间】:2017-10-0312:30:30【问题描述】:我正在尝试将使用KitKat作为目标版本开发的应用程序迁移到Nougat。我想实现新的权限功能。我的应用... 查看详情

在现有 Spring Boot REST 应用程序中实现时区的最佳策略 [重复]

】在现有SpringBootREST应用程序中实现时区的最佳策略[重复]【英文标题】:BestStrategytoimplementTimeZoneinanexistingSpringBootRESTapplication[duplicate]【发布时间】:2017-08-0611:06:33【问题描述】:为现有应用程序实施TimeZone的任何最佳策略。因... 查看详情

如何在此服务器中实现 Websocket 握手?

...发布时间】:2015-01-2110:34:54【问题描述】:我需要在我的Python服务器中实现Websocket握手。我的python服务器使用Twisted进行事件处理。我发现thiswebpage解释了这个过程,但是当涉及到这一点时,我真的很头疼。那么如何在下面的服务 查看详情

如何在uiwebview中实现触摸事件?

】如何在uiwebview中实现触摸事件?【英文标题】:Howtoimplementtoucheventsinuiwebview?【发布时间】:2011-06-0704:34:36【问题描述】:我尝试了本网站和其他网站上提供的各种解决方案来在uiwebview上实现触摸事件。但我仍然无法做到这一... 查看详情

在鸿蒙中实现类似瀑布流效果

简介  鸿蒙OS开发SDK中对于长列表的实现ListContainer的实现较为简单,没法想RecyclerView一样通过使用不同的LayoutManager来实现复杂布局因此没法快速实现瀑布流效果。  但鸿蒙OS也都支持控件的Measure(onEstimateSize),layout(onArra... 查看详情