0

クラスに、他のクラスのプロパティを使用する別のクラスの関数を使用させようとしています。

問題の詳細は次のとおりです。

という基本クラスがあるとしましょうWorker。それぞれWorkerが に取り組みたいと考えていHouseます。それぞれに、選択して完了することができる のWorkerリストがあります。TaskそれぞれTaskname、タスクを完了するのに必要な 、 、 があり、 が実際にタスクを実行できるようにする機能もdescriptionあります。energy_costdo_taskWorker

これをコードで表すと次のようになります。

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にインスタンスを渡すことができます。TaskWorker

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

しかし、それは不格好であり、非常に不必要に思えます。

Taska のクラス定義でそれぞれを継承することもできWorkerますが、追加の属性は必要なく、do_task複数の がある場合はメソッドがオーバーライドされTaskます。

理想的には、Workerはの属性にアクセスできるようTaskにフォーム内で a を実行できる必要があり、オブジェクト内で定義されたようなプロパティを使用できる必要があります。worker.do_task()do_taskWorkerenergy_costTask

どうすればそれを行うことができますか?

4

1 に答える 1