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という例外を発生させる必要があります。


配列のエミュレートには他にもたくさんの特殊メソッドを実装する必要があります。

独自クラスで真面目にやるとかなり大変ですね。