python中的特殊方法 __getitem__()

python中的特殊方法 __getitem__()
原创Solarzhou 最后发布于2019-07-19 14:08:37 阅读数 1240  收藏
展开
特殊方法----getitem()
Python的特殊方法__getitem_() 主要作用是可以让对象实现迭代功能。我们通过一个实例来说明。

定义一个Sentence类,通过索引提取单词。

import re
RE_WORD = re.compile(r'\w+')
class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)  # re.findall函数返回一个字符串列表,里面的元素是正则表达式的全部非重叠匹配
    def __getitem__(self, index):
        return self.words[index]  
1
2
3
4
5
6
7
8
测试
>>> s = Sentence('The time has come')
>>> for word in s:
            print(word)
    
    The
    time
    has
    come
>>> s[0]
    'The'
>>> s[1]
    'time'
1
2
3
4
5
6
7
8
9
10
11
12
通过测试发现,示例 s 可以正常迭代。但是没有定义 getitem() 测试则会报错, TypeError: '***' object is not iterable 。

序列可以迭代
我们都知道序列是可以迭代,下面具体说明原因。

解释器需要迭代对象x时, 会自动调用iter(x)方法。内置的 iter(x) 方法有以下作用

检查对象是否实现了__inter__ 方法,如果实现了就调用它(也就是我们偶尔用到的特殊方法重载),获取一个迭代器。
如果没有实现iter()方法, 但是实现了 __getitem__方法,Python会创建一个迭代器,尝试按顺序(从索引0开始,可以看到我们刚才是通过s[0]取值)获取元素。
如果尝试失败,Python抛出TypeError异常,通常会提示TypeError: '***' object is not iterable。
任何Python序列都可迭代的原因是,他们都实现了__getitem__方法。其实,标准的序列也都实现了 __iter__方法。

注意: 从python3.4 开始,检查对象x能否迭代,最准确的方法是: 调用iter(x)方法,如果不可迭代,在处理TypeError异常。这比使用isinstance(x,abc.Iterable)更准确,因为iter()方法会考虑到遗留的__getitem__()方法,而abc.Iterable类则不考虑。
————————————————
版权声明:本文为CSDN博主「Solarzhou」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZT7524/article/details/96479481

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值