我试图让一个类使用另一个类中的一个函数,该类使用另一个类的属性。
下面是详细的问题:
假设我们有一个名为 的基类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
属性。
我们将如何去做呢?