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