0

我试图让一个类使用另一个类中的一个函数,该类使用另一个类的属性。

下面是详细的问题:

假设我们有一个名为 的基类Worker。每个Worker人都想在House. 每个Worker都有一个Task可以选择和完成的 s 列表。每个Task都有一个name, a description, anenergy_cost来完成任务,它也有一个do_task函数可以让Worker实际完成任务。

下面是我们如何在代码中表示它:

from abc import ABC, abstractmethod

class House(object): #The object a worker works on
    pass 

#Tasks start here   

class Task(ABC):

    @property
    @abstractmethod
    def name(self):
        pass

    @property
    @abstractmethod
    def description(self):
        pass

    @property
    @abstractmethod
    def energy_cost(self):
        pass

    @abstractmethod
    def do_task(self):
        pass


class Paint(Task):
    name = "Paint"
    description = "Paint a house partially"
    energy_cost = 20

    def do_task(self, house):
        #paint house here


class Slosh(Task):
    name = "Slosh"
    description = "Completely cover a house in paint"
    energy_cost = 40

    def do_task(self, house):
        #slosh house here

#Worker classes

class Worker(object):

    def __init__(self):
        self.energy = 100
        self.current_task = None

    def set_task(self, task):
        self.current_task = task

    def work(self, house):
        self.energy -= self.current_task.energy_cost
        self.current_task.do_task(house)


class Painter(Worker):

    def __init__(self):
        self.task_list = [Paint, Slosh]
        super().__init__()

但是,如果我们需要访问 aWorker的一个属性来执行 a怎么办Task?假设 aWorker有一个属性,称为work_speed指定任务完成的速度。怎么会Task知道Worker'swork_speed是什么?我们可以将一个Worker实例传递给一个task_listTask中的实例,如下所示:Worker

self.task_list = [Paint(self), Slosh(self)]

但这很笨拙,而且似乎也非常不必要。

我们也可以Task在 a 的类定义中继承 each Worker,但我们不需要额外的属性,如果我们有多个s ,该do_task方法将被覆盖。Task

理想情况下, aWorker应该能够Task在表单中执行 aworker.do_task()以便do_task可以访问 aWorker的属性,并且它应该能够使用对象energy_cost内部定义的Task属性。

我们将如何去做呢?

4

1 回答 1

0

为什么不将您的担忧分开;您在工人的工作职能中执行的与工人有关的任何事情?

这往往是我的方法,如果您需要访问该工人的速度、当前能量等,请在该工人的工作函数中进行。

在您提出的示例中,如果我走这条路,我将创建一个通用的 Worker 超类,不同类型的 Worker 将继承该超类。

然后在 Worker 超类中,我会做这样的事情:

class Worker():
"""The worker superclass, all workers inheirit from this"""
def work(self):
    """Perform the required task if any, deduct costs, if any, as necessary"""

    if self.current_task is not  None:
        if all(self.energy, self.current_task.energy_cost): self.energy -= self.current_task.energy_cost
        if all(self.money, self.current_task.monetary_cost): self.money -= self.current_task.monetary_cost
        if all(self.workspeed, self.current_task.duration): time.sleep(self.current_task.duration/self.workspeed)
        if self.current_task.do_task: self.current_task.do_task()

然后,只要您在超类中有一个案例,您就可以随意向子类添加属性。否则,您可以为每个子类编写一个方法并super().work()在每个特殊情况之前/之后调用,但数据处理实际上取决于您。

于 2018-07-08T03:13:18.180 回答