Pythonで独自クラスで配列をエミュレートしてみる
今回は演算子によるアクセスと、forループのみを実装してみます。
配列のエミュレートをするには特殊メソッドを使います。
まずは演算子の実装
__getitem__で[]演算子で値を取り出す時の処理をエミュレートできます
class Foo(): def __getitem__(self,key): return key * 2 foo = Foo() print(foo[0]) print(foo[1]) print(foo[2])
$ py main.py 0 2 4
__setitem__で[]演算子で値を設定する時の処理をエミュレートできます
class Foo(): def __setitem__(self,key,value): print(key,value) foo = Foo() foo[2] = 10
$ py main.py 2 10
forループのエミュレートは__iter__を用意し、そこでイテレータオブジェクトを返す必要があります。
そしてイテレータオブジェクトには__next__を実装しておく必要があります。
例として指定した数までカウントするイテレータを実装してみます。
class Foo(): def __init__(self,max_counter): self.__max_counter = max_counter self.__counter = 0 def __iter__(self): return self def __next__(self): self.__counter += 1 if self.__counter > self.__max_counter: self.__counter = 0 raise StopIteration return self.__counter foo = Foo(10) for item in foo: print(item)
$ py main.py 1 2 3 4 5 6 7 8 9 10
ループを終了させるにはStopIterationという例外を発生させる必要があります。
配列のエミュレートには他にもたくさんの特殊メソッドを実装する必要があります。
独自クラスで真面目にやるとかなり大変ですね。