Python __len__() 方法

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() 函数,此时就会引发异常。

上一篇: __delattr__()

下一篇: __getitem__()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号