MonoImageIterator 親クラスの作成 - Rubyist の Python 学習記録(14)

PythonLibrary Python 2019年 1月 17日

ここまで書いた段階で 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__ は親クラスで定義されているので削除した.

短いがきりがいいので今日はここまで.