💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
ここまで書いた段階で MonoImagePixelIterator と MonoImageBlockIterator でほぼ同じ表記であることを示した. すなわち多くの部分が共通に記述できることになる.そこで,共通部分を MonoImageIterator として親クラスに吸い出すことにした.
MonoImageIterator の作成
-
MonoImageIterator は両クラスの共通部分だけを抜き出したものになる. すなわち,__init__ コンストラクタ,value プロパティ,__iter__ メソッドを抜き出した.
class MonoImageIterator: def __init__(self, mono_image): self._mono_image = mono_image self._width = mono_image.width self._height = mono_image.height self._f = self.vector_iterator_func if mono_image.ndim == 1 else self.matrix_iterator_func self._getter = self.vector_getter_func if mono_image.ndim == 1 else self.matrix_getter_func self._setter = self.vector_setter_func if mono_image.ndim == 1 else self.matrix_setter_func @property def value(self): return self._getter() @value.setter def value(self, v): self._setter(v) def __iter__(self): return self._f()
MonoImagePixelIterator の修正
-
MonoImagePixelIterator の class 記述および __init__ は以下のように変更する. 親クラスである MonoImageIterator を継承するようにし,__init__ は super().__init__ を呼び出すだけである.
class MonoImagePixelIterator(MonoImageIterator): def __init__(self, mono_image): super().__init__(mono_image)
- value プロパティおよび __iter__ は親クラスで定義されているので削除した.
MonoImageBlockIterator の修正
-
MonoImageBlockIterator の class 記述および __init__ も以下のように変更する. 親クラスである MonoImageIterator を継承するようにし,__init__ も super().__init__ を呼び出している. MonoImagePixelIterator との違いは,_br, _bc, _sr, _sc, _is_small_ok 変数を定義する点である.
class MonoImageBlockIterator(MonoImageIterator): def __init__(self, mono_image, br, bc, sr, sc, is_small_ok): super().__init__(mono_image) self._br = br self._bc = bc self._sr = sr self._sc = sc self._is_small_ok = is_small_ok
- MonoImagePixelIterator と同様 value プロパティおよび __iter__ は親クラスで定義されているので削除した.
短いがきりがいいので今日はここまで.