在 Python 面向对象编程 中,有一些特殊的方法被称为“魔术方法”(Magic Methods)或“双下划线方法”(Dunder Methods),它们以双下划线开头和结尾(如 __init__、__str__ 等)。其中,__len__ 方法是一个非常实用的魔术方法,用于定义一个对象的“长度”。

__len__ 是 Python 内置函数 len() 背后调用的方法。当你对一个对象使用 len(obj) 时,Python 实际上会调用该对象的 obj.__len__() 方法。
例如,对于列表、字符串、字典等内置类型,它们都实现了 __len__ 方法:
my_list = [1, 2, 3]print(len(my_list)) # 输出:3# 等价于print(my_list.__len__()) # 输出:3在开发中,我们经常需要创建自己的类(例如表示“购物车”、“书架”、“队列”等)。为了让这些自定义对象也能像内置类型一样使用 len() 函数,我们就需要实现 __len__ 方法。
这不仅让代码更直观、更符合 Python 的习惯(即“Pythonic”),还能提升代码的可读性和一致性。
要实现 __len__,只需在你的类中定义一个名为 __len__ 的方法,并让它返回一个非负整数(int 类型)。
下面是一个简单的例子:一个表示“书架”的类,可以存放多本书:
class Bookshelf: def __init__(self): self.books = [] def add_book(self, book): self.books.append(book) def __len__(self): return len(self.books)# 使用示例shelf = Bookshelf()shelf.add_book("《Python入门》")shelf.add_book("《算法导论》")print(len(shelf)) # 输出:2在这个例子中,我们通过实现 __len__ 方法,使得 len(shelf) 能够返回书架上书籍的数量。
__len__ 返回负数或非整数,Python 会抛出 TypeError 或 ValueError。len() 通常被频繁调用,建议 __len__ 的实现尽量高效(例如直接返回一个已维护的计数器,而不是每次都计算长度)。错误示例:
class BadExample: def __len__(self): return -1 # 错误!会引发 ValueErrorobj = BadExample()print(len(obj)) # ValueError: __len__() should return >= 0在实际项目中,__len__ 常与其他魔术方法一起使用,比如 __getitem__、__iter__ 等,使自定义对象表现得更像一个容器(如列表或集合)。
class MyList: def __init__(self, items=None): self._items = items or [] def __len__(self): return len(self._items) def __getitem__(self, index): return self._items[index] def __iter__(self): return iter(self._items)mylist = MyList([10, 20, 30])print(len(mylist)) # 3print(mylist[1]) # 20for item in mylist: print(item) # 10, 20, 30通过本文,你已经掌握了 Python __len__方法 的基本用法和最佳实践。它是 Python魔术方法 家族中的重要一员,能让你的 自定义对象长度 行为更加自然、符合直觉。
记住:只要你的类代表一个“容器”或“集合”,就考虑实现 __len__ 方法。这不仅能提升代码的可读性,也是遵循 Python面向对象编程 最佳实践的重要一步。
现在,快去试试为你自己的类添加 __len__ 吧!
本文由主机测评网于2025-12-22发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251211309.html