Z
ZHANK
面向对象

魔术方法

理解 __str__/__repr__/__eq__/__hash__/__call__ 等

魔术方法

魔术方法(dunder methods)是带双下划线的方法,让你自定义类的行为。


常用魔术方法

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

    def __str__(self):           # print() / str()
        return f"Vector({self.x},{self.y})"

    def __repr__(self):          # 调试输出
        return f"Vector({self.x},{self.y})"

    def __len__(self):           # len()
        return 2

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

    def __eq__(self, other):     # ==
        return self.x==other.x and self.y==other.y

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

    def __getitem__(self, i):    # [索引]
        return self.x if i==0 else self.y

v1, v2 = Vector(1,2), Vector(3,4)
print(v1)           # Vector(1,2)
print(v1 + v2)      # Vector(4,6)
print(v1 == Vector(1,2))  # True
print(v1 * 3)       # Vector(3,6)
print(v1[0], v1[1]) # 1 2

魔术方法速查表

方法触发用途
`__init__``obj = Class()`构造
`__str__``print(obj)`字符串
`__len__``len(obj)`长度
`__add__``obj1 + obj2`加法
`__eq__``obj1 == obj2`相等判断
`__getitem__``obj[i]`索引访问
`__enter__/__exit__``with obj:`上下文管理

小结

魔术方法让你的类像内置类型一样工作,是 Python 强大表达能力的重要来源。