ITPub博客

首页 > 应用开发 > Python > Python 序列协议的 __len__ 方法

Python 序列协议的 __len__ 方法

原创 Python 作者:raptors 时间:2025-11-13 14:54:05 0 删除 编辑

# Python 序列协议的 `__len__` 方法


在 Python 中,序列协议要求对象实现 `__len__()` 方法来返回序列的长度。这是使对象表现得像内置序列类型(如列表、元组、字符串等)的基本协议之一。


## 如何使用 `__len__`


要使自定义类支持 `len()` 函数,你需要实现 `__len__` 方法:


```python

class MySequence:

    def __len__(self):

        # 返回一个表示序列长度的整数

        return 42


seq = MySequence()

print(len(seq))  # 输出: 42

```


## 序列协议要求


1. `__len__` 必须返回一个非负整数

2. 如果长度为零,`__bool__` 应该返回 `False`(这是 Python 的惯用做法)


## 完整序列协议示例


一个完整的序列协议通常还包括 `__getitem__`:


```python

class MySequence:

    def __init__(self, data):

        self.data = data

    

https://zq-mobile.zhaopin.com/moment/73384909

https://zhiq.zhaopin.com/moment/73384909

https://zq.zhaopin.com/moment/73384491

https://zq-mobile.zhaopin.com/moment/73384491

https://zhiq.zhaopin.com/moment/73384491

https://zq.zhaopin.com/moment/73383924

https://zq-mobile.zhaopin.com/moment/73383924

https://zhiq.zhaopin.com/moment/73383924

https://zq.zhaopin.com/moment/73383856

https://zq-mobile.zhaopin.com/moment/73383856

https://zhiq.zhaopin.com/moment/73383856

https://zq.zhaopin.com/moment/73383209

https://zq-mobile.zhaopin.com/moment/73383209

https://zhiq.zhaopin.com/moment/73383209

https://zq.zhaopin.com/moment/73383011

https://zq-mobile.zhaopin.com/moment/73383011

https://zhiq.zhaopin.com/moment/73383011

https://zq.zhaopin.com/moment/73382140

https://zq-mobile.zhaopin.com/moment/73382140


    def __len__(self):

        return len(self.data)

    

    def __getitem__(self, index):

        return self.data[index]


seq = MySequence([1, 2, 3, 4, 5])

print(len(seq))      # 输出: 5

print(seq[2])        # 输出: 3

print(seq[:3])       # 输出: [1, 2, 3]

```


## 注意事项


- `__len__` 应该快速执行,因为许多 Python 操作(如 `bool()` 转换)会调用它

- 返回的值必须是整数,否则会引发 `TypeError`

- 如果长度不可用或没有意义,最好不要实现 `__len__`


通过实现 `__len__`,你的自定义对象可以更好地与 Python 的内置函数和习惯用法集成。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101284/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448