如何使一个类使用从另一个类获取属性的函数?

时间:2018-07-08 02:49:50

标签: python function object inheritance abstract-base-class

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

这是详细的问题:

假设我们有一个名为Worker的基类。每个Worker都想在House上工作。每个Worker都有一个Task列表,可以选择并完成。每个Task都具有完成任务所需的namedescriptionenergy_cost,并且还具有允许{{ 1}}来实际完成任务。

这是我们在代码中的表示方式:

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__() 怎么办?假设Worker有一个名为Task的属性,它指定任务完成的速度。 Worker怎么知道work_speed的{​​{1}}是什么?我们可以像这样将Task实例传递给Worker的task_list内的work_speed实例:

Worker

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

我们也可以继承Task的类定义中的每个Worker,但是我们不需要额外的属性,如果我们有多个self.task_list = [Paint(self), Slosh(self)] 方法将被覆盖Task

理想情况下,Worker应该能够以do_task的形式进行Task,以便Worker可以访问Task的属性,并且它应该能够使用在worker.do_task()对象内部定义的do_task之类的属性。

我们将如何去做?

1 个答案:

答案 0 :(得分: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(),但是数据处理确实取决于您。