2009年10月17日土曜日

演算子のオーバーロード

クラスに特殊メソッドを定義する

# -*- coding: utf-8 -*-

class A:
    # 二項算術演算
    def __add__(self, i):
        return 10 + i
    def __sub__(self, i):
        return 10 - i
    def __mul__(self, i):
        return 10 * i
    def __div__(self, i):
        return 10 / i
    def __truediv__(self, i):
        return 10 / i
    def __floordiv__(self, i):
        return 10 // i
    def __mod__(self, i):
        return 10 % i
    def __divmod__(self, i):
        return (10 / i, 10 % i)
    def __pow__(self, i):
        return 10 ** i
    def __lshift__(self, i):
        return 10 << i
    def __rshift__(self, i):
        return 10 >> i
    def __and__(self, i):
        return 10 & i
    def __xor__(self, i):
        return 10 ^ i
    def __or__(self, i):
        return 10 | i
    # 単項算術演算
    def __neg__(self):
        return -10
    def __pos__(self):
        return +10
    def __abs__(self):
        return abs(10)
    def __invert__(self):
        return ~10
    # 比較演算
    def __lt__(self, i):
        return 10 < i
    def __le__(self, i):
        return 10 <= i
    def __eq__(self, i):
        return 10 == i
    def __ne__(self, i):
        return 10 != i
    def __gt__(self, i):
        return 10 > i
    def __ge__(self, i):
        return 10 >= i

a = A()

print a + 2
print -a
print a < 4

# 2 + a
# 逆を出来るようにするには r をつけた特殊メソッドを定義する
# __radd__, __rsub__, __rmul__, __rdiv__, __rtruediv__
# __rfloordiv__, __rmod__, __rdivmod__, __rpow__, __rlshift__
# __rrshift__, __rand__, __rxor__, __ror__

# a += 2
# += などを出来るようにするには i をつけた特殊メソッドを定義する
# __iadd__, __isub__, __imul__, __idiv__, __itruediv__
# __ifloordiv__, __imod__, __ipow__, __ilshift__
# __irshift__, __iand__, __ixor__, __ior__

詳細はドキュメントで

0 件のコメント:

コメントを投稿