特殊方法 #

特殊方法(魔术方法)以双下划线开头和结尾。

一、对象表示 #

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