gpt4 book ai didi

python - 是否有一种只使用对象的模式?

转载 作者:太空狗 更新时间:2023-10-29 21:42:35 26 4
gpt4 key购买 nike

假设您要使用 Task2Do 类的对象表示要完成的任务。这些对象是可运行的,也就是说,它们有一个执行任务的方法doTask

另一方面,您有这些对象的队列(python 中的示例):

a = Task2Do(method1, args1)
b = Task2Do(method1, args2)
c = Task2Do(method2, args3)

pending = [a,b,c]

您想运行所有挂起的任务:

for t in pending:
t.doTask()

可能有人引入了一个 bug,导致同一个对象在 pending 队列中出现两次:

pending = [a,a,c]

您可以保护您的代码:

class Task2Do:
def __init__(self, target, args):
self._todo = target
self._args = args
self._done = False

def doTask(self):
if not self._done: # Protection against double execution
self._todo(*self._args)
self._done = True

我的问题是:这是否有名称作为设计模式?我听说有人在 C++ 中实现了类似调用对象析构函数的功能。

你还知道哪些类似的模式?

最佳答案

我能想到的最简单的方法是:

class Task2Do:
def __init__(self, target, args):
self._todo = target
self._args = args

def doTask(self):
self._todo(*self._args)
self._todo = lambda: None
self._args = ()

这看起来比旗帜更干净。或者,让 self._todo 在第二次调用时抛出错误。您甚至可以通过将 self._todo 设置为 None 来做到这一点。


但老实说,任务不一定非得是类。大多数时候,拥有一个函数会更容易、更符合习惯。在这种情况下,您可以使用生成器来获得一次性使用:

def task2do(target, *args, **kwargs):
def iter_run_once():
yield target(*args, **kwargs)
raise ValueError("Multiple calls to one-time-use task")

return iter_run_once().__next__

F = task2do(print, 1, 2, 3)

F()
#>>> 1 2 3

F()
#>>> Traceback (most recent call last):
#>>> File "", line 14, in <module>
#>>> File "", line 4, in iter_run_once
#>>> ValueError: Multiple calls to one-time-use task

为了好玩,请注意您还可以:

def task2do(target, *args, **kwargs):
return (lambda: (yield target(*args, **kwargs)))().__next__

;)

关于python - 是否有一种只使用对象的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25844494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com