Python 使用对象作为函数

Python 使用对象作为函数,python,function,oop,Python,Function,Oop,我正在阅读Dusty Phillips的一本Python OOPs书。我无法理解书中的一个特定程序,第7章-Python面向对象快捷方式。代码的扩展版本可用 尽管该程序属于主题函数也是对象,但提供的程序也使用了一个奇怪的代码,我觉得这更像是相反的意思(使用对象作为函数) 我已经指出了代码中我有疑问的那一行。TimedEvent的变量callback如何像函数Timer类一样使用?这部分是怎么回事 import datetime import time class TimedEvent:

我正在阅读Dusty Phillips的一本Python OOPs书。我无法理解书中的一个特定程序,第7章-Python面向对象快捷方式。代码的扩展版本可用

尽管该程序属于主题函数也是对象,但提供的程序也使用了一个奇怪的代码,我觉得这更像是相反的意思(使用对象作为函数)

我已经指出了代码中我有疑问的那一行。
TimedEvent
的变量
callback
如何像函数
Timer
类一样使用?这部分是怎么回事

import datetime
import time

class 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)
导入日期时间
导入时间
班级时间:
定义初始化(self、endtime、callback):
self.endtime=endtime
self.callback=回调
def就绪(自我):
返回self.endtime怀疑
self.events.remove(事件)
睡眠时间(0.5)
两者都是正确的

  • 函数是对象:对函数执行
    dir(f)
    以查看其属性
  • 对象可以用作函数:只需添加
    \uuuuu调用\uuuuu(self,…)
    方法,并像函数一样使用对象
通常,可以使用
which(x,y,z)
之类的语法调用的东西称为可调用项

该示例试图说明的是,方法是对象属性,也是可调用的。正如您可以编写
obj.x=5
,您也可以编写
obj.f=some_函数

两者都是正确的

  • 函数是对象:对函数执行
    dir(f)
    以查看其属性
  • 对象可以用作函数:只需添加
    \uuuuu调用\uuuuu(self,…)
    方法,并像函数一样使用对象
通常,可以使用
which(x,y,z)
之类的语法调用的东西称为可调用项


该示例试图说明的是,方法是对象属性,也是可调用的。正如您可以编写
obj.x=5
,您也可以编写
obj.f=some_函数

是的,该示例确实表明函数是对象。您可以将一个对象分配给
回调
属性,这将尝试显示您分配给
回调
的对象可以是一个函数

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\u current\u time
,因为
event.callback
print\u current\u time
,是的,该示例确实显示函数是对象。您可以将一个对象分配给
回调
属性,这将尝试显示您分配给
回调
的对象可以是一个函数

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\u current\u time
,因为
event.callback
print\u current\u time

它们真的是方法吗?不仅仅是存储为属性的函数?将“方法”定义为“在类主体内定义的函数。[…]”,这里它们是顶级函数。@superbrain:这很复杂。当使用
object.f
查找函数时,函数成为方法。方法是一个已经传递了
self
参数的函数(这是定义的重要部分,不管它们在哪里定义)。看看描述符协议是如何实现的。描述符非常有趣,它们解释了python的各个方面。
self
是在代码中显式编写的,但它不是由程序员传递的,而是由解释器传递的。当使用点查找函数时,使用描述符协议会发生这种情况。但是,如果你感兴趣的话,这真的很复杂,你可以看看描述符。只是为了确定:你已经看到它们有这样的函数,它们作为属性存储在
self.callback=callback
(右边的
callback
就是这个函数),然后被调用?它们真的是方法吗?不仅仅是存储为属性的函数?将“方法”定义为“在类主体内定义的函数。[…]”,这里它们是顶级函数。@superbrain:这很复杂。当使用
object.f
查找函数时,函数成为方法。方法是一个已经传递了
self
参数的函数(这是定义的重要部分,不管它们在哪里定义)。看看描述符协议是如何实现的。描述符非常有趣,它们解释了python的各个方面。
self
是在代码中显式编写的,但它不是由程序员传递的,而是由解释器传递的。当使用点查找函数时,使用描述符协议会发生这种情况。但是,如果你有兴趣研究描述符的话,这真的很复杂。只是要确定一下:你已经看到它们有这样的函数,它们作为属性存储在
self.callback=callback
(右边的
callback
就是这个函数),然后被调用?那么
callback
是如何初始化的呢?你没有展示那部分。是否为其分配了功能?或者别的什么?你可以在TimedEvent的init中看到它。但我想知道它是如何被用来调用其他对象的!顺便说一下,完整的代码也在一个链接中提供。代码中唯一的“回调”是我提到的。这是不够的,因为我们不知道在调用之后如何调用!查看链接的代码,
call\u after
总是通过
callback
的常规函数调用。所以
callback
…只包含一个函数。那么
callback
是如何初始化的呢?你没有展示那部分。是否为其分配了功能?还是别的什么?