検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>
python_cookbook

Python Cookbook [Delegating Iteration : 独自クラスへのイテレーション機能の実装] 投稿一覧へ戻る

Published 2020年5月1日19:41 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

Problem:

list や tuple といったイテラブルを属性値として含む独自のコンテナクラスがある場合に、そのクラス自体でイテレーション機能を提供したい。


Solution:

クラス内で __iter__() メソッドを定義し、実態として、内部で保持するコンテナのイテレーターに動作をお任せするだけです、楽チンです。


class Topping:
def __init__(self, value):
self._value = value
self._pizza = []

def __repr__(self):
return 'Topping [{!r}]'.format(self._value)

def add_topping(self, topping):
self._pizza.append(topping)

def __iter__(self):
return iter(self._pizza)

if __name__ == '__main__':
base = Topping('dough')

topping1 = Topping('cheese')
topping2 = Topping('shrimp')
topping3 = Topping('green pepper')
topping4 = Topping(4)

base.add_topping(topping1)
base.add_topping(topping2)
base.add_topping(topping3)
base.add_topping(topping4)

for tp in base:
print(tp)

# Topping ['cheese']
# Topping ['shrimp']
# Topping ['green pepper']
# Topping [4]




Python におけるイテレータープロトコルでは、実際のイテレーション作業を受け持つ __next__() メソッドを実装したイテレーターオブジェクトを返す __iter__() メソッドの実装が求められます。


今回の例のように、内部で保持するコンテナオブジェクトの要素をイテレートするだけなのであれば、何も考える必要はありません。


そのコンテナオブジェクトのイテレーターに全てお任せです。


このコードで利用している iter(s) メソッドは、s.__iter__() を呼び出して対象オブジェクトのイテレーターを返しているだけです。