Python 避免在对象列表中重复执行,所有对象都调用相同子对象的相同方法

Python 避免在对象列表中重复执行,所有对象都调用相同子对象的相同方法,python,Python,首先,我为这个糟糕的标题道歉,但我找不到更好的描述 让我们用一个例子来描述我的问题: 我有两门课:家庭作业和学生作业 class Homework: def __init__(self, name): self.name = name def execute(self): print(f"Hello. I'm the {self.name} homework and my execution is long and tedious&qu

首先,我为这个糟糕的标题道歉,但我找不到更好的描述

让我们用一个例子来描述我的问题:

我有两门课:家庭作业和学生作业

class Homework:
    def __init__(self, name):
        self.name = name

    def execute(self):
        print(f"Hello. I'm the {self.name} homework and my execution is long and tedious")
        result = 0
        return result

class Student:
    def __init__(self, homework):
        self.homework = homework

    def do_homework(self):
        return self.homework.execute()
每个学生都从一个列表中分配一份家庭作业,其中可用的家庭作业数量远小于学生数量(大约300名学生有2份家庭作业)

我想为每个学生调用方法
do_homography
,并收集列表中的输出

output = [st.do_homework() for st in all_students]
这将调用指定作业的方法
execute
。但是,由于作业的执行时间长且繁琐,我希望每个作业类型的
execute
方法只执行一次,然后根据
所有学生的顺序在输出列表中重复输出

一个简单的解决方案可能是拥有一个
dict
Homeworks
,并从中创建一个
dict
。然后,每个学生都应该指出**而不是家庭作业对象本身,而是家庭作业
*的
dict
中该家庭作业的键

我发现后一种解决方案有点脆弱,因为
学生
家庭作业
之间的间接联系仅仅依赖于两个键的比较

是否可以实现相同的结果,将对
作业的引用保留在
学生
中?有什么好主意吗

PS:我的代码中的“学生”是结构元素,每个元素都可以是不同的材料(“家庭作业”)。在执行过程中,我设置了一个温度,并希望运行一个方法,该方法的输出仅取决于元素的材质。因此,相同材质的所有元素将输出相同的值。然而,这个计算是“长”的,对每个元素重复数千次是浪费时间的,因为我只有很少的材料。因此我的问题

您可以使用它来记录结果,以便缓存方法调用的结果

import functools

class Homework:
    def __init__(self, name):
        self.name = name

    @functools.lru_cache(maxsize=None)
    def execute(self):
        print(f"Hello. I'm the {self.name} homework and my execution is long and tedious")
        result = 0
        return result
现在,在执行其余代码之后,唯一的输出是

你好。我正在做数学作业,我的作业又长又乏味
你好我正在做化学作业,我的作业又长又乏味


正如您所看到的,每个
作业
只输出一次
执行
的结果。

因此,如果可以避免,您希望避免多次执行昂贵的操作吗?听起来你想要一个缓存。查看
functools.lru\u cache
,看看它是否适合您的需要。马上!谢谢你给我指明了这个方向。我不认识这个装饰师
import functools

class Homework:
    def __init__(self, name):
        self.name = name

    @functools.lru_cache(maxsize=None)
    def execute(self):
        print(f"Hello. I'm the {self.name} homework and my execution is long and tedious")
        result = 0
        return result