Python学習(書籍Fluent Pythonより)

はじめに

Pythonの学習としてこの本↓の special methods のオーバーライドを試してみる。
amzn.asia

ソースコード

写経したコードは以下のとおり。__init__に関しては特筆する必要はないでしょう。(自分には必要だけれど)

from math import hypot

class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)

    def __abs__(self):
        return hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Vector(x, y)

    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

v1 = Vector(2, 4)
v2 = Vector(2, 1)
print(v1 + v2) # Vector(4, 5)
v = Vector(3, 4)
print(abs(v)) # 5.0
print(v * 3)  # Vector(9, 12)
print(abs(v * 3)) # 15.0

各メソッドの機能

__repr__

offcial string representationとある。ソースコードにもあるprintなどで表示される表現を規定する、ってことでいいんでしょうか。(__str__()は文字列型へのデータ変換?なのでこれとは別。)

__abs__

組み込み関数abs(object)で呼ばれた時の動作。

__bool__

truth value testingとあるので、if文の条件に使うのか。

__add__ , __mul__

それぞれ算術演算(+, *)の時の動作。乗算はVectorに対するスカラー乗算。(内積はnumpyに倣ってdot()とか定義したほうがいいでしょうか。)

math.hypot()

なんだこれ、ってことでリファレンス。
9.2. math — Mathematical functions — Python 3.7.0 documentation
Return the Euclidean normとあり、まんまsqrt(x*x + y*y)と書いてあるのでベクトルの長さですね。

リファレンス

上記の特殊関数を調べるのに参考にした。
3. Data model — Python 3.7.0 documentation

追記

このページも結構良さそう。
特殊メソッド名 - Dive Into Python 3 日本語版