Python(クラスの特殊メソッド)

クラスは、特殊な名前のメソッドを定義して、特殊な構文 (算術演算や添え字表記、スライス表記など) による特定の演算を実装できます。
特殊メソッドをオーバーライドすることで 演算子に対する独自の振る舞いを定義したり、 組み込み型をエミュレートしたりすることができるようになります。
詳しくは以下のサイトを参照

Pythonリファレンス
https://docs.python.org/ja/3.6/reference/datamodel.html

例として無限偶数、無限奇数をイテレーターとして返すクラス定義のプログラムを以下に記載しますが__len__(self)は正しい値を返すようには定義していないのでご了承ください。

class Even:
    def __init__(self):
        self.i = 0    
    def __contains__(self,x):
        return x%2 == 0
    def __str__(self):
        return "even numbers"
    def __iter__(self):
        return self
    def __next__(self):
        result = self.i
        self.i += 2
        return result
    def __getitem__(self,i):
        return 2*i
    def __len__(self):
        return 0
        

2 in Even()
11 in Even()
2**100 in Even()

for x in Even():
    if x > 100:
        break

Even()[3]
Even()[900]

len(Even())

[*range(0,9,2)]
range(100,200,5)[3]
class Odd:
    def __init__(self):
        self.i = 1    
    def __contains__(self,x):
        return x%2 == 1
    def __str__(self):
        return "odd numbers"
    def __iter__(self):
        return self
    def __next__(self):
        result = self.i
        self.i += 2
        return result
    def __getitem__(self,i):
        return 2*i+1
    def __len__(self):
        return 0
        

2 in Odd()
11 in Odd()
3**100 in Odd()

for x in Odd():
    if x > 100:
        break

Odd()[3]
Odd()[900]

len(Odd())

def __contains__(self,x):を定義することで 2 in Odd()のようにinメソッドに対する真偽値を返すことができるようになります。
ちなみに未定義の場合は 例外 (たいていAttributeError か TypeError) が送出されます。

def __str__(self): を定義することで str(Odd())のようにstrメソッドに対するstring型を返すことができるようになります。

def __ iter __ (self):とdef __ next __ (self): を定義することで for x in Odd():のようにイテレータとして振舞うことができるようになります。

def __ getitem __ (self,i): を定義することで Odd()[3]のように要素を得ることができるようになります。

def __ len __ (self): を定義することで len(Odd())のように lenメソッドに対するint型の値を返すことができるようになります。

[*range(0,9,2)]はrangeモジュールで設定した値をリスト表示させる方法ですが、次回の投稿では自作rangeをクラスの特殊メソッドで実装してみたいと思います。

2019/11/08追記
def __ repr __ (self): を定義することでIDLEなどで、変数名を指定するだけで出力結果を得ることができるようになります。
詳しくは以下のサイト参照
https://blowup-bbs.com/python-specific-method-repr-str/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Python

次の記事

Python(MyRangeクラス)