读源码的时候看到了一些不太熟悉的方法,网上了解的时候有的看起来说清楚了,有的纯粹恶心人,自己写了两个例子再对照着看了一下,记录一下
以前学的是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

物联沃分享整理
物联沃-IOTWORD物联网 » python基础 __getitem__

发表评论