1. Python魔法方法深度解析:掌控对象行为的终极指南
作为一名Python开发者,你是否曾经好奇过为什么有些对象可以直接用len()获取长度,而有些却不能?为什么有些类实例可以直接像函数一样调用?这些看似神奇的行为背后,其实都归功于Python的魔法方法(Magic Methods)。
魔法方法是Python面向对象编程中最强大也最容易被忽视的特性之一。它们以双下划线开头和结尾(如__init__),由Python解释器在特定场景下自动调用,让我们能够自定义类的基本行为。掌握这些方法,你就能像Python内置类型一样优雅地设计自己的类。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 魔法方法基础:从打印对象到自定义比较
2.1 对象表示:__str__与__repr__
当你打印一个对象时,Python会先查找__str__方法。如果没有定义,则回退到__repr__。这两个方法都返回字符串,但用途不同:
__str__:面向用户,提供友好的、可读性强的字符串表示__repr__:面向开发者,提供准确的、可用于重建对象的字符串表示
python复制class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def __str__(self):
return f"{self.name} - ¥{self.price:.2f}"
def __repr__(self):
return f"Product('{self.name}', {self.price})"
p = Product("笔记本电脑", 5999)
print(str(p)) # 笔记本电脑 - ¥5999.00
print(repr(p)) # Product('笔记本电脑', 5999)
最佳实践:
__repr__应该返回一个字符串,当被eval()执行时能够重建对象。如果做不到,至少应该包含有用的调试信息。
2.2 让对象可测量:__len__
__len__方法允许我们自定义len()函数对对象的处理方式。这不仅适用于集合类,任何有"大小"概念的对象都可以实现它。
python复制class Playlist:
def __init__(self, songs):
self.songs = songs
def __len__(self):
return len(self.songs)
pl = Playlist(['Song1', 'Song2', 'Song3'])
print(len(pl)) # 输出3
2.3 让对象可调用:__call__
通过实现__call__方法,我们可以让类的实例像函数一样被调用。这在创建有状态的函数或实现装饰器类时特别有用。
python复制class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
counter = Counter()
print(counter()) # 1
print
