看ONMT代码,发现有处直接使用iter(obj),直接蒙了,直接将内置的iter函数作用于对象。后来发现这个对象里实现了__getitem__()方法。
先看示例:
class Test:
def __init__(self):
self.l = [4,5,6,7]
def __getitem__(self, item):
return self.l[item]
t = Test()
iter_t = iter(t)
for i in iter_t:
print(i)
#更常见的用法
class Test1:
def __init__(self, text):
self.text = text
def __getitem__(self, index):
result = self.text[index].upper()
return result
print("------------------------")
p = Test1("abcd")
for char in p:
print(char)
结果
4
5
6
7
A
------------------------
A
B
C
D
python中除了可以使用内建的类型,如list,tuple,dict。还可以创建自己的对象来实现 像 这些内建类型的访问,但需要在定义类的时候实现一些魔法方法:
class Student:
def __init__(self, name, age, sex, height):
self.info = {"name":name, "age":age, "sex":sex, "height":height}
def __getitem__(self, item):
return self.info[item]
def __setitem__(self, key, value):
self.info[key] = value
def __len__(self):
return len(self.info)
s = Student(name='ming', age=18, sex="男", height=178)
print(s['name'])
print(s['sex'])
s['sex'] = '女'
print(s['sex'])
print(len(s))
结果:
ming
男
女
4
class P:
def __init__(self,a,b,c):
self.l = [a,b,c]
def __getitem__(self, item):
return self.l[item]
def __setitem__(self, key, value):
self.l[key] = value
def __len__(self):
return len(self.l)
p = P(1,2,3)
print(p[0])
print(p[2])
p[0] = "lsj"
print(p[0])
print(len(p))
结果:
1
3
lsj
3
实现这些方法可以方便的访问对象内部元素。