属性访问
方法 | 作用 |
---|---|
_ _ getattr_ _ (self,name) | 定义当用户试图获取一个不存在的属性时的行为 |
_ _ getattribute_ _ (self,name) | 定义当该类的属性被访问时的行为 |
_ _ setattr_ _ (self,name,value) | 定义当一个属性被设置时的行为 |
_ _ defatttr_ _ (self,name) | 定义当一个属性被删除时的行为 |
>>> class B:
def __init__(self):
self.a = 'cat'
>>> b=B()
>>> b.a
'cat'
>>> getattr(b,'a','没有此属性')
'cat'
>>> getattr(b,'x','没有此属性')
'没有此属性'
首先a.x会调用_ _ getattribute_ ()魔方方法,然后调用super(). _ getattribute_ _(name),复习找不到属性名x,一次紧接着调用 _ _ getatttr _ _().
>>> class A:
def __getattribute__(self,name):
print('getattribute')
return super().__getattribute__(name)
def __getattr__(self,name):
print('getattr')
def __setattr__(self,name,value):
print('setattr')
super().__setattr__(name,value)
def __delattr__(self,name):
print('delattr')
super().__delattr__(name)
>>> a=A()
>>> a.x
getattribute
getattr
>>> a.x=2
setattr
>>> a.x
getattribute
2
>>> del a.x
delattr
求一矩形的面积:
class Rectangle:
def __init__(self,width=0,height=0):
self.width=width
self.height=height
def __setattr__(self,name,value):
if name=='square':
self.width=value
self.height=value
else:
super().__setattr__(name,value)
def getarea(self):
return self.width*self.height
>>> r=Rectangle(5,6)
>>> r.getarea()
30
>>> r1=Rectangle()
>>> r1.square=10
>>> r1.width
10
>>> r1.height
10
>>> r1.getarea()
100
关于super的介绍:
转载链接点击此处———感觉讲的很清楚
描述符
描述符就是将某种特殊类型的类的实例指派给另一个类的属性。
方法 | 作用 |
---|---|
_ _get _ _(self,instance,owner) | 用于访问属性,它返回属性值 |
_ _ set _ _(self,instance,value) | 将在属性分配操作中调用,不返回任何内容 |
_ _ delete_ _(self,instance) | 控制删除操作,部分会任何内容 |
<__ main __.Mydecripter object at 0x0000029F1F5DB160> 描述符类本身的一个实例——self
< __ main __.Test object at 0x0000029F1F71DC10> 类Test的实例test——instance
< class ’ __ main __.Test’> 类Test本身——owner
>>> class Mydecripter:
def __get__(self,instance,owner):
print('geting...',self,instance,owner)
def __set__(self,instance,value):
print('seting...',self,instance,value)
def __delete__(self,instance):
print('deleting...',self,instance)
>>> class Test:
x=Mydecripter()
>>> test=Test()
>>> test.x
geting... <__main__.Mydecripter object at 0x0000029F1F5DB160> <__main__.Test object at 0x0000029F1F71DC10> <class '__main__.Test'>
>>> test
<__main__.Test object at 0x0000029F1F71DC10>
>>> Test
<class '__main__.Test'>
>>> test.x='abc'
seting... <__main__.Mydecripter object at 0x0000029F1F5DB160> <__main__.Test object at 0x0000029F1F71DC10> abc
>>> del test.x
deleting... <__main__.Mydecripter object at 0x0000029F1F5DB160> <__main__.Test object at 0x0000029F1F71DC10>
Property是一个描述符类
自定义property()函数
>>> class Property:
def __init__(self,fget=None,fset=None,fdel=None):
self.fget=fget
self.fset=fset
self.fdel=fdel
def __get__(self,instance,owner):
return self.fget(instance)
def __set__(self,instance,value):
return self.fset(instance,value)
def __delete__(self,instance):
self.fdel(instance)
>>> class A:
def __init__(self):
self._x=None#加下划线是不希望被外部访问
def getX(self):
return self._x
def setX(self,value):
self._x=value
def delX(self):
del self._x
x=Property(getX,setX,delX)
>>> a=A()
>>> a.x='carrot'
>>> a._x#成功赋值进去
'carrot'
>>> del a.x
华氏度与摄氏度间的转化
class Centigrade:#摄氏度
def __init__(self,value=0):
self.value=float(value)
def __get__(self,instance,owner):
return self.value
def __set__(self,instance,value):
self.value=float(value)
class Fahrenheit:#华氏度
def __get__(self,instance,owner):
return instance.cen*1.8+32
def __set__(self,instance,value):
instance.cen=(float(value)-32)/1.8
class Temperature:
cen = Centigrade()
fah = Fahrenheit()
>>> temp=Temperature()
>>> temp.cen
0.0
>>> temp.fah
32.0
>>> temp.cen=16
>>> temp.fah
60.8
>>> temp.fah=89
>>> temp.cen
31.666666666666664