python

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

66

564 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.monitorconditionsを取得し、ループさせる場合は4行目のようにmc.monitorconditions.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 69.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

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

ツイッター

@darkimpact0626