python的item方法_python定制类__getitem__()方法

今天在学习python的定制类,教程里面展示了如何用__getitem__方法,实现某个类的切片。

python

class Fib(object):

def getitem(self, n):

if isinstance(n, int): # n是索引

a, b = 1, 1

for x in range(n):

a, b = b, a + b

return a

if isinstance(n, slice): # n是切片

start = n.start

stop = n.stop

if start is None:

start = 0

a, b = 1, 1

L = []

for x in range(stop):

if x >= start:

L.append(a)

a, b = b, a + b

return L

廖雪峰大大的教程虽说是“零起点”,但是有些地方确实不太详细,对于初学者来说容易懵逼。比如上面代码中有一段

```python```

isinstance(n,slice)

当时我就想 “What ? ! slice居然也是一种数据类型?!”

于是我尝试通过type来确认,但是结果很糟糕

7bc437f7b8c7

尝试通过type来确认数据类型slice

我又想,难道slice是一种有限制的数据类型?和本文开头那段代码中一样,只有作为参数时才能是slice类型?

于是我决定定义一个函数来验证我的想法,果不其然,又失败了。

7bc437f7b8c7

尝试通过定义函数来确认

因为我们之前在切片时,slice总是直接用在序列的后面,如

>>> L = [1,2,3,4,5]

>>> L[2:]

[3, 4, 5]

>>> T = ('a','b','c','d','e')

>>> T[:-2]

('a', 'b', 'c')

所以一般情况下,它根本没办法作为参数传入函数中。

PS:上面我通过type验证失败之后,想通过自定义函数验证其实是多此一举,因为type其实就是一个内置函数。type不成功,自定义函数也不会成功的

那么话说回来,为什么本文开头的那段代码中,slice能被传入并且进行类型判断呢?

仔细看了下教程中传入slice的方式

python

f = Fib()

f[0:5]

[1, 1, 2, 3, 5]

f[:10]

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

跟我们对序列使用切片时一毛一样?WTF ?

原来是因为__\_\_getitem\_\_这种带双下划线方法的特殊性__

在本文开头那个例子中,如果类定义了这个\_\_getitem\_\_方法,那么对类进行切片时,切片会作为\_\_getitem\_\_的参数传入,还可以通过start和stop方法获取到切片的两个值…

####妹的,都是套路啊…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值