python面向对象描述符
前言:
亲爱的小伙伴们,还记得python中人见人爱的property()方法吗?
在Python中,实例化对象访问类的属性可以通过【实例对象名.属性名】来访问。但是这样子的操作做破坏了面向对象的封装性!因此,Python一顿操作猛如虎,通过在类属性名前面加上双下划线,即为类属性设置私有访问权限,然后通过实例化对象调用getter(),setter()方法来间接访问这些私有属性。
然而,【实例对象名.属性名】的方式改为使用getter()、setter()方法将使代码变得更加复杂臃肿。因此诞生了人见人爱的property()方法!property()方法能够非常简洁、灵活地访问类的属性。那么property()方法的内部实现机制是什么呢?
——今天的主角:描述符
1.概念:在python,描述符是一个特殊的类。这个特殊的类可以将其实例对象指派给另一个普通类的属性。
2.特殊的类:包含一下方法任何一种:
__get __(self,instance,owner) 用于访问属性,返回属性的值
__set __(self,instance,value) 属性分配操作中调用,不返回任何内容
__delete __(self,instance) 控制删除操作,不返回任何内容
3.图解-定义描述符类的本质:
4.图解-描述符的应用-实现python中的property方法
代码实例:
>>> class Myproperty:#定义一个描述符类Myproperty
def __init__(self,fget,fset,fdel):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self,instance,owner):
return self.fget(instance)
def __set__(self,instance,value):
self.fset(instance,value)
def __del__(self,instance):
self.fdel(instance)
>>> class C:
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 = Myproperty(getX,setX,delX) #描述符类实例化对象指派给普通类C的属性x
>>> c = C()
>>> c.x = 'X-MAN'
>>> c.x
'X-MAN'
>>> c._x
'X-MAN'
>>>