特殊方法 #
特殊方法(魔术方法)以双下划线开头和结尾。
一、对象表示 #
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self): # str()调用
return f"{self.name} ({self.age})"
def __repr__(self): # repr()调用
return f"Person('{self.name}', {self.age})"
def __format__(self, spec):
if spec == 'name':
return self.name
return str(self)
p = Person("Tom", 25)
print(str(p)) # "Tom (25)"
print(repr(p)) # "Person('Tom', 25)"
print(f"{p:name}") # "Tom"
二、比较方法 #
python
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __lt__(self, other):
return (self.x, self.y) < (other.x, other.y)
def __le__(self, other):
return self == other or self < other
p1 = Point(1, 2)
p2 = Point(1, 2)
p3 = Point(2, 1)
print(p1 == p2) # True
print(p1 < p3) # True
三、算术运算 #
python
class Number:
def __init__(self, value):
self.value = value
def __add__(self, other):
return Number(self.value + other.value)
def __sub__(self, other):
return Number(self.value - other.value)
def __mul__(self, other):
return Number(self.value * other.value)
def __str__(self):
return str(self.value)
a = Number(5)
b = Number(3)
print(a + b) # 8
print(a - b) # 2
四、容器方法 #
python
class MyList:
def __init__(self, items):
self.items = 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
def __delitem__(self, index):
del self.items[index]
def __contains__(self, item):
return item in self.items
def __iter__(self):
return iter(self.items)
lst = MyList([1, 2, 3])
print(len(lst)) # 3
print(lst[0]) # 1
print(2 in lst) # True
for item in lst:
print(item)
五、可调用对象 #
python
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, x):
return x * self.factor
double = Multiplier(2)
print(double(5)) # 10
print(callable(double)) # True
六、上下文管理 #
python
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
return False
with FileManager('test.txt', 'w') as f:
f.write('Hello')
七、属性访问 #
python
class Dynamic:
def __getattr__(self, name): # 访问不存在的属性
return f"Attribute {name} not found"
def __setattr__(self, name, value): # 设置属性
print(f"Setting {name} = {value}")
super().__setattr__(name, value)
d = Dynamic()
print(d.unknown) # "Attribute unknown not found"
d.x = 1 # "Setting x = 1"
八、常用特殊方法 #
| 方法 | 用途 |
|---|---|
__init__ |
初始化 |
__str__ |
字符串表示 |
__repr__ |
官方表示 |
__eq__ |
相等比较 |
__lt__ |
小于比较 |
__add__ |
加法 |
__len__ |
长度 |
__getitem__ |
索引访问 |
__setitem__ |
索引赋值 |
__iter__ |
迭代 |
__call__ |
可调用 |
__enter__/__exit__ |
上下文管理 |
最后更新:2026-03-16