python之__getitem__ 方法
前言
如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。
当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。
示例1
实例对象的key不管是否存在都会调用类中的__getitem__()方法。而且返回值就是__getitem__()方法中规定的return值。
# -*- coding:utf-8 -*- class DataTest: def __init__(self,id,address): self.id=id self.address=address self.d={self.id:1, self.address:"192.168.1.1" } def __getitem__(self,key): return "hello" data=DataTest(1,"192.168.2.11") print data[2]
运行结果:
hello
示例2:利用P['k']方式获取实例对象的属性
A类的实例A()可以通过点的方式获取到属性【类的实例对象属性是构造方法中的初始化实例对象的属性】:
class A(object): count = 0 def __init__(self): self.name = "gogo" self.age = 18 def start(self): print("start1111111") a = A() print(a.count) print(a.name)
如果想实现a['name']这种方式取值,在类中定义 __getitem__() 方法就可以实现:
class A(object): count = 0 def __init__(self): self.name = "gogo" self.age = 18 def start(self): print("start1111111") def __getitem__(self, item): return object.__getattribute__(self, item) # 通过实例对象.属性获取属性 a = A() print(a.count) print(a.name) # 通过[key]语法调用属性 print(a['count']) print(a['age']) print(a['start']) print(a['start']())
运行结果:
0 gogo 0 18 <bound method A.start of <__main__.A object at 0x0000027CC08D96D8>> start1111111 None
示例三:[Python的魔法方法__getitem__
可以让对象实现迭代功能:即将实例对象转换为可迭代对象]
Python的魔法方法 __getitem__() 可以让对象实现迭代功能,这样就可以使用for...in...
来迭代该对象了
class Animal: def __init__(self, animal_list): self.animals_name = animal_list animals = Animal(["dog","cat","fish"]) for animal in animals: print(animal)
在用 for..in..
迭代对象时,如果对象没有实现 __iter__
,__next__
迭代器协议,Python的解释器就会去寻找__getitem__
来迭代对象,如果连__getitem__
都没有定义,这解释器就会报对象不是迭代器的错误:
TypeError: 'Animal' object is not iterable
而实现这个方法后,就可以正常迭代对象了。
class Animal: def __init__(self, animal_list): self.animals_name = animal_list def __getitem__(self, index): return self.animals_name[index] animals = Animal(["dog", "cat", "fish"]) for animal in animals: print(animal) a = Animal(["dog", "cat", "fish"])[0] b = Animal(["dog", "cat", "fish"])[1] c = Animal(["dog", "cat", "fish"])[2] print('\n') print(a, b, c, sep='\n')
运行结果:
dog
cat
fish
dog
cat
fish
去期待陌生,去拥抱惊喜。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!