Skip to content

特殊方法:str、__repr__与魔术方法 ​

str 和 repr ​

python
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __repr__(self):
        return f"Point({self.x}, {self.y})"
    
    def __str__(self):
        return f"({self.x}, {self.y})"

p = Point(3, 4)
print(repr(p))  # Point(3, 4)
print(str(p))   # (3, 4)
print(p)        # (3, 4)(默认调用__str__)

运算符重载 ​

python
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
    
    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

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

容器协议 ​

python
class MyList:
    def __init__(self, items):
        self.items = list(items)
    
    def __len__(self):
        return len(self.items)
    
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value

ml = MyList([1, 2, 3])
print(len(ml))   # 3
print(ml[1])     # 2
ml[1] = 99
print(ml.items)  # [1, 99, 3]

练习 ​

  1. 实现__eq__:为Point类实现相等比较。
  2. 自定义容器:实现支持len()和索引的Stack类。
  3. 运算符重载:为Fraction类实现加减乘除。

答案:第四章答案

下一节:属性与描述符

用心记录每一步成长