特殊方法: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]练习
- 实现__eq__:为Point类实现相等比较。
- 自定义容器:实现支持len()和索引的Stack类。
- 运算符重载:为Fraction类实现加减乘除。
答案:第四章答案
下一节:属性与描述符