python实例属性,类属性,特殊属性的使用,及属性访问的顺序简单介绍

xiaoxiao2025-07-15  8

# -*- coding: utf-8 -*- """ 实例属性,类属性,特殊属性的使用,及属性访问的顺序 """ class Rec: def __init__(self): self.w=0 self.h=0 def setSize(self,size): self.w,self.h=size def getSize(self): return self.w, self.h size=property(getSize,setSize) class Rec2: '''使用特殊属性''' def __init__(self): self.w=0 self.h=0 def __setattr__(self,name,value): '''如果要给name赋值,就调用这个方法''' print("调用函数__setattr") if(name=='size'): self.w,self.h=value else: self.__dict__[name]=value def __getattr__(self,name): '''如果name被访问,同时它不存在,此方法被调用,起拦截作用''' print("调用函数__getattr") if(name=='size'): return self.w,self.h else: return "wrong Attribute" class Rec3: '''不使用property,也不使用特殊函数''' def __init__(self): self.w=0 self.h=0 def setSize(self,size): self.w,self.h=size def getSize(self): return self.w, self.h class Rec4: '''探讨函数调用的顺序''' area=0 #类属性 def __init__(self): self.w=0 self.h=0 def __getattr__(self,name): print("调用函数__getattr") if name not in ['w','h','area']: print("Attribute error!") if __name__=="__main__": r=Rec() r.w=3 r.h=4 print(r.size) r.size=1,2 print(r.w,r.h) r.x=7 print(r.__dict__) print("********************start Rec2***********************") r2=Rec2() #两次调用__setattr__函数 r2.w=3 #一次调用__setattr__函数 r2.h=4 #一次调用__setattr__函数 print(r2.__dict__) print(r2.size) #一次调用__getattr__函数 r2.size=1,2 print(r2.w,r2.h) #不调用调用__getattr__函数 r2.x=7 #调用函数__setattr__,并将x写入到r2的__dict中 print(r2.__dict__) print("********************start Rec3***********************") r3=Rec3() r3.w=3 r3.h=4 #print(r3.size) 报错 AttributeError: 'Rec3' object has no attribute 'size' r3.size=1,2 print(r3.w,r3.h) r3.x=7 print(r3.__dict__)#r3的__dict__属性比r,r2多一个size print("********************start Rec4***********************") r4=Rec4() #实例化后,实例r4含有属性w,h,并不包含属性area print(r4.__dict__) print(r4.area) #先在实例属性中找area,没有,再到类属性中找area,找到输出0 print(r4.v) #先在实例属性中找v,没有,再到类属性中找v,没有,调用函数__getattr__,并输出None

运行结果:

(3, 4) 1 2 {'w': 1, 'h': 2, 'x': 7} ********************start Rec2*********************** 调用函数__setattr 调用函数__setattr 调用函数__setattr 调用函数__setattr {'w': 3, 'h': 4} 调用函数__getattr (3, 4) 调用函数__setattr 调用函数__setattr 调用函数__setattr 1 2 调用函数__setattr {'w': 1, 'h': 2, 'x': 7} ********************start Rec3*********************** 3 4 {'w': 3, 'h': 4, 'size': (1, 2), 'x': 7} ********************start Rec4*********************** {'w': 0, 'h': 0} 0 调用函数__getattr Attribute error! None

转载请注明原文地址: https://www.6miu.com/read-5033111.html

最新回复(0)