クラスに、他のクラスのプロパティを使用する別のクラスの関数を使用させようとしています。
問題の詳細は次のとおりです。
という基本クラスがあるとしましょうWorker
。それぞれWorker
が に取り組みたいと考えていHouse
ます。それぞれに、選択して完了することができる のWorker
リストがあります。Task
それぞれTask
にname
、タスクを完了するのに必要な 、 、 があり、 が実際にタスクを実行できるようにする機能もdescription
あります。energy_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__()
Worker
しかし、aを実行するために a の属性の1 つにアクセスする必要がある場合はどうなるTask
でしょうか。タスクが完了する速度を指定するWorker
という属性があったとします。work_speed
が何であるかをどのようにTask
知ることWorker
ができwork_speed
ますか? 次のように、 の task_list内のインスタンスWorker
にインスタンスを渡すことができます。Task
Worker
self.task_list = [Paint(self), Slosh(self)]
しかし、それは不格好であり、非常に不必要に思えます。
Task
a のクラス定義でそれぞれを継承することもできWorker
ますが、追加の属性は必要なく、do_task
複数の がある場合はメソッドがオーバーライドされTask
ます。
理想的には、Worker
はの属性にアクセスできるようTask
にフォーム内で a を実行できる必要があり、オブジェクト内で定義されたようなプロパティを使用できる必要があります。worker.do_task()
do_task
Worker
energy_cost
Task
どうすればそれを行うことができますか?