我试图让一个类使用另一个类的函数,该函数使用另一个类的属性。
这是详细的问题:
假设我们有一个名为Worker
的基类。每个Worker
都想在House
上工作。每个Worker
都有一个Task
列表,可以选择并完成。每个Task
都具有完成任务所需的name
,description
和energy_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
之类的属性。
我们将如何去做?
答案 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()
,但是数据处理确实取决于您。