python

しょっちゅう忘れることを書いておく。

33

300 views

クラスをイテレーション化する

クラスのメンバ変数にself.__conditionsというリストを作成する。
self.__conditionsは9行目のgetterで取得できる。

class MonitorConditions(object):
    def __init__(self, monitor_condition: MonitorCondition = None):
        self.__conditions = []
        if monitor_condition is not None:
            if validate_instance(monitor_condition, MonitorCondition):
                self.append(monitor_condition)

    @property
    def conditions(self) -> list[MonitorCondition]:
        return self.__conditions

    def append(self, monitor_condition: MonitorCondition) -> None:
        validate_instance(monitor_condition, MonitorCondition)
        self.__conditions.append(monitor_condition)

    def __iter__(self):
        yield from self.__monitor_conditions

コール元でself.monitor_conditionsを取得し、ループさせる場合は4行目のようにmc.monitor_conditions.conditionsと書き、ループさせる。

if __name__ == '__main__':
    mc = MonitorConditions()

    for cond in mc.conditions:
        print(cond)

これを以下の4行目のようにクラスそのものを指定しても同様の動きをさせるにはどうすれば良いか。

if __name__ == '__main__':
    mc = MonitorConditions()

    for cond in mc:
        print(cond)

正解はクラスに__iter__メソッドを作成して、yieldでself.__conditionsを返却する(16行目~17行目)。

class MonitorConditions(object):
    def __init__(self, monitor_condition: MonitorCondition = None):
        self.__conditions = []
        if monitor_condition is not None:
            if validate_instance(monitor_condition, MonitorCondition):
                self.append(monitor_condition)

    @property
    def conditions(self) -> list[MonitorCondition]:
        return self.__conditions

    def append(self, monitor_condition: MonitorCondition) -> None:
        validate_instance(monitor_condition, MonitorCondition)
        self.__conditions.append(monitor_condition)

    def __iter__(self):
        yield from self.__conditions

__iter__は、for文などの繰り返し処理のときに呼ばれるマジックメソッド、yieldは関数を一時停止することができる文。

Page 39 of 56.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626