我们知道利用property可以间接操作对象的属性,那么它的原理是怎样的呢?
property的原理也就是Python当中描述符的原理
那么描述符又是啥?
这里对“特殊类”这样定义:实现了
这几个方法的类就叫特殊类
那么描述符就是把特殊类的实例赋值给某个类的对象。
比如:
class MyProperty:
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):
self.fset(instance, value)
def __delete__(self, instance):
self.fdel(instance)
这里的MyProperty类就是特殊类
再来看:
class Test:
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)
这里的x就是描述符,通过它可以j=间接操作Test实例中的_x,比如:
有了这些概念,再来讲property的原理:
x能够操作_x,那么具体是如何进行操作的呢?
x = MyProperty(getX, setX, delX)这里就是用Test类的三个方法初始化了MyProperty的一个实例,那么x这个对象当中就有了Test类中的这三个方法
当用Test的实例t调用x(t.x)的时候,Python会自动转去执行MyProperty类中的__get__方法,在__get__方法中调用的其实就是Test当中的getX方法,看这张图(从最后的t.x开始看):
这个就是property的原理了