python面向对象——常用内置方法
class Person(): #构造函数 def __init__(self,name,age=None): self.name=name self.age=age self.lists=[1,3,5] self.dicts={} #打印函数,类似java中的toSring() def __str__(self): return 'Peason(%s)'%self.name #对象的字典表示 def __dict__(self): return {'name':self.name} #对象相加 def __add__(self,obj): return self.age+obj.age #匹配对象[index]模式 def __getitem__(self,item): return self.lists[item] #匹配对象[key]=value模式 def __setitem__(self,k,v): self.dicts[k]=v print(self.dicts) #匹配del 对象 def __delitem__(self,k): del self.dicts[k] print(self.dicts) #可迭代对象必须实现 def __iter__(self): return iter(self.lists) #在类的对象被执行的时候obj()会执行 def __call__(self,args,**kwargs): print('i was called!%s,%s'%(args,kwargs['b'])) #在类对象被int()处理时调用 def __int__(self): return self.age if __name__=='__main__': li=Person('lili') print(li) print(li.__dict__()) li['score']=100 li['score2']=200 del li['score'] for i in li: print(i) li(10,b=20) li.age=30 print(int(li))
getattr、setattr、delattr
当使用obj.x = y
的时候触发对象的setattr
方法,当del obj.x
的时候触发对象的delattr
方法。
当尝试访问对象的一个不存在的属性时 obj.noexist
会触发getattr
方法,getattr
方法是属性查找中优先级最低的。
可以重写这3个方法来控制对象属性的访问、设置和删除。
**特别注意:如果定义了getattr,而没有任何代码(即只有pass),则所有不存在的属性值都是None而不会报错,可以使用super().__getattr__()方法来处理**
class Student: def __getattr__(self, item): print('访问一个不存在的属性时候触发') return '不存在' def __setattr__(self, key, value): print('设置一个属性值的时候触发') # self.key = value # 这样会无限循环 self.__dict__[key] = value def __delattr__(self, item): print('删除一个属性的时候触发') if self.__dict__.get(item, None): del self.__dict__[item] stu = Student() stu.name = 'zlw' # 设置一个属性值的时候触发 print(stu.noexit) # 访问一个不存在的属性时候触发 , 返回'不存在' del stu.name # 删除一个属性的时候触发
enter、exit
这两个方法的重写可以让我们对一个对象使用with
方法来处理工作前的准备,以及工作之后的清扫行为。
class db_conn(object): def __init__(self, conn_id): self.conn = MySqlHook.get_connection(conn_id=conn_id).get_hook().get_conn() self.cur = self.conn.cursor() def __enter__(self): return self.cur def __exit__(self, exc_type, exc_value, exc_trace): self.conn.commit() self.cur.close() self.conn.close()
iter、next
这2个方法用于将一个对象模拟成序列。内置类型如列表、元组都可以被迭代,文件对象也可以被迭代获取每一行内容。重写这两个方法就可以实现自定义的迭代对象。
class MyRange(): def __init__(self,begin,end,step): self.begin=begin self.end=end self.step=step self.count=0 def __iter__(self): return self def __next__(self): if self.begin <self.end: self.count=self.begin self.begin=self.begin+self.step return self.count else: raise StopIteration('已经到达临界') if __name__=='__main__': ra=MyRange(1,20,3) for item in ra: print(item)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗