在Python中,在使用 for...in...迭代对象时,其对象需要是可迭代对象,如List, String, tuple等。
在使用 for...in...时,Python解释器会首先判断此对象是否实现了 __iter__ __next__等迭代器协议,如果没有,则会寻找此对象的__getitem__ , 如果都没有实现,则解释器会报:此对象非可迭代对象。
例如:
class Tiger():
def __init__(self, name):
self.name = name
def getName(self, index):
if(abs(index) > len(self.name)):
return None
else:
return self.name[index]
tiger_a = Tiger(["Paul", "Short", "TallGul"])
name = tiger_a.getName(-2)
print(name)
for tiger in tiger_a:
print(tiger.getName(0))
此处会报错:
TypeError: 'Tiger' object is not iterable
如何让一个类对象可以被迭代,可以在class中定义 __getitem__()方法。让此class的对象变成迭代对象。
例如:
class Tiger():
def __init__(self, name):
self.name = name
def getName(self, index):
if(abs(index) > len(self.name)):
return None
else:
return self.name[index]
def __getitem__(self, index):
if(abs(index) > len(self.name)):
return None
else:
return self.name[index]
tiger_obj = Tiger(["Paul", "Short", "TallGul"])
name = tiger_obj.getName(-2)
print(name)
print("for...in...")
for tiger in tiger_obj:
print(tiger)
print("[]")
print(tiger_obj[0])
注意:
使用for...in... ,即相当于从0开始,到-1调用 __getitem__().
除此之外,使用 []也相当于调用__getitem__(idx).