# -*- 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