python基础 __getitem__
读源码的时候看到了一些不太熟悉的方法,网上了解的时候有的看起来说清楚了,有的纯粹恶心人,自己写了两个例子再对照着看了一下,记录一下
以前学的是java,在java里面所有的对象都是默认继承自object类的,所以默认可以使用和重写一些父类方法,这些方法的作用不是调用,而是在特定情况下显现,比如print的时候
在python里面也有类似的方法,__getitem__就是这一类
import numpy as np
class temp:
def __init__(self, i):
self.id = np.arange(i)
def __getitem__(self, index):
i = self.id[index]
return i
def greeting(self):
print("Hello", self.id)
这里greeting就是一个调用的方法,也是初学的时候最常用的写法
然后__getitem__则是在迭代的时候才会发挥作用
t = temp(9)
t
output:<__main\__.temp at 0x1938accef70>
这里直接放上t返回的是新建的这个对象的地址
for i in t:
print(i)
output:0 1 2 3 4 5 6 7 8
对对象t进行迭代的时候调用了__getitem__
如果删掉该方法则会报错:
'temp' object is not iterable
判断后发现,在加上__getitem__方法后,相当于将类变成了一个iterable类,即类似于数组,可以取其中某一项可以用循环迭代的类,具体如何取,则是调用__getitem__方法来判断
如果没有写return,也可以迭代但是会默认返回None
迭代的次数也是__getitem__来决定,如果在方法体里以数组的方法获取值,那么无法获取值的时候就会停止,但是如果写成print(“Hello”),就会无限循环
展示几个错误示范
class temp:
def __init__(self, i):
self.id = np.arange(i)
def __getitem__(self, index):
i = self.id[index]
def __len__(self):
return self.id
使用这个类进行迭代会返回i个None
class temp3:
def __init__(self, i):
self.id = np.arange(i)
def __getitem__(self, index):
print("Hello")
def __len__(self):
return self.id
使用这个会无限打印Hello