为了账号安全,请及时绑定邮箱和手机立即绑定

使用对象作为函数

使用对象作为函数

噜噜哒 2023-04-18 15:34:05
我正在阅读 Dusty Phillips 的一本 Python OOPs 书。我无法理解书中的特定程序,第 7 章 - Python 面向对象的快捷方式。代码的扩展版本可在此处获得尽管该程序属于Functions are objects too主题,但所提供的程序还使用了一个奇怪的代码,我觉得这更像是相反的意思(将对象用作函数)。我已经指出了代码中我有疑问的那一行。callback该变量如何TimedEvent像函数Timer类一样使用?这部分发生了什么。import datetimeimport timeclass TimedEvent:    def __init__(self, endtime, callback):        self.endtime = endtime        self.callback = callback    def ready(self):        return self.endtime <= datetime.datetime.now()class Timer:    def __init__(self):        self.events = []    def call_after(self, delay, callback):        end_time = datetime.datetime.now() + \        datetime.timedelta(seconds=delay)        self.events.append(TimedEvent(end_time, callback))    def run(self):        while True:            ready_events = (e for e in self.events if e.ready())            for event in ready_events:                event.callback(self)               ----------------> Doubt                self.events.remove(event)            time.sleep(0.5)
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

两个都是真的

  • 函数是对象:dir(f)对函数执行 a 以查看其属性

  • 对象可以用作函数:只需添加__call__(self, ...)方法并像函数一样使用对象。

一般来说,可以使用类似语法调用的东西whatever(x, y, z)称为callables

该示例试图表明的是,方法只是对象属性,也是可调用对象。就像你会写obj.x = 5,你也会写obj.f = some_function


查看完整回答
反对 回复 2023-04-18
?
白板的微信

TA贡献1883条经验 获得超3个赞

是的,这个例子确实表明函数是对象。您可以将一个对象分配给callback属性,这试图表明您分配给的对象callback可以是一个函数。

class TimedEvent:
    def __init__(self, endtime, callback):
        self.endtime = endtime
        self.callback = callback

需要明确说明的是初始化。例如,您可以这样做:

def print_current_time(): 
   print(datetime.datetime.now().isoformat())

event = TimedEvent(endtime, print_current_time)
event.callback()

这实际上会调用print_current_time,因为event.callbackprint_current_time


查看完整回答
反对 回复 2023-04-18
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信