Python __len__() 语法
__len__() 是 Python 的一个特殊方法(又称 “魔法方法” 或 “双下划线方法”),它用于定义当对象被 len() 函数调用时,如何计算并返回其长度。
语法:
class MyCollection:
def __len__(self):
# 返回集合中元素的数量
return value
说明:
__len__() 方法不接收任何参数,除了 self(实例本身)。
__len__() 方法必须返回一个非负整数(int 类型),该整数代表了对象的长度或元素个数。如果返回其他类型或负数,可能会导致 TypeError 或 ValueError 异常。
__len__() 方法的结果,还会影响对象的布尔真值测试:
- 如果 __len__() 返回 0,则对象在布尔上下文中被认为是 False。
- 如果 __len__() 返回非零值,则对象在布尔上下文中被认为是 True。
- 如果同时定义了 __len__() 和 __bool__() 方法,则 __bool__() 的优先级更高,它会决定对象的真值。
提示:
- Python 官方建议:__len__() 的返回值应该是该对象包含的 “元素” 数量,而不是其他任意的数值。
- 如果一个类实现了 __len__() 方法,那么当对该类的实例调用 len() 函数时,Python 会自动调用这个方法。
- __len__() 方法在实现自定义的容器类型(如自定义列表、字典、集合等)时非常有用,它使得这些自定义对象能够像内置容器一样响应 len() 函数。
Python __len__() 摘要
| 属于 | Python 魔法方法 |
|---|---|
| 使用频率 | 高 |
| 官方文档 | 查看 |
| 相关方法 | __bool__() |
Python __len__() 示例
接下来,我们通过几个简单的例子来讲解一下 Python __len__() 方法是如何使用的。
示例 1:对内置类型使用 len()
# 列表
my_list = [10, 20, 30, 40, 50]
print(len(my_list))
# 字符串
my_string = 'lvyenet'
print(len(my_string))
# 字典
my_dict = {'a': 1, 'b': 2, 'c': 3}
print(len(my_dict))
# 元组
my_tuple = (1, 2, 3)
print(len(my_tuple))
运行结果如下。
5
7
3
3
分析:
对于内置的序列类型(如列表、字符串、元组)和映射类型(如字典),len() 函数会直接返回其包含的元素数量。这是因为这些内置类型都内部实现了 __len__() 方法。
示例 2:自定义类实现 __len__()
class ShoppingCart:
def __init__(self):
self.items = []
def add_item(self, name, count=1):
self.items.append({'name': name, 'qty': count})
print(f'添加了 {count} 个 {name}')
def __len__(self):
# 返回购物车中商品的总种类数
return len(self.items)
def __str__(self):
return f'购物车中共有 {len(self)} 种商品'
# 创建购物车实例
cart = ShoppingCart()
print(cart) # 此时 __len__() 还没有被直接调用
cart.add_item('苹果', 5)
cart.add_item('香蕉', 3)
print(len(cart)) # 触发 __len__() 调用
print(cart) # 再次触发 __len__() 调用
运行结果如下。
购物车中共有 0 种商品
添加了 5 个 苹果
添加了 3 个 香蕉
2
购物车中共有 2 种商品
分析:
在这个例子中,我们定义了一个 ShoppingCart 类,并为其实现了 __len__() 和 __str__() 这两个方法。
当我们对 ShoppingCart 实例调用 len() 函数时(不管是直接调用,还是通过 print(cart) 间接调用),Python 都会自动调用我们定义的 __len__() 方法,并返回 self.items 列表的长度。
示例 3:未实现 __len__() 的自定义类
class MyObject:
def __init__(self, name):
self.name = name
obj = MyObject('绿叶网')
try:
print(len(obj))
except TypeError as e:
print(e)
运行结果如下。
(报错)object of type 'MyObject' has no len()
分析:
从结果可以看出,只有实现了 __len__() 特殊方法的对象才可以使用 len() 函数。如果一个自定义类没有提供这个方法,然后我们尝试对它使用 len() 函数,此时就会引发异常。
