|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
为什么下面的gettter\setter\deleter方法需要return self ?
- class PropertyL:
- 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)
- def getter(self, func):
- self.fget = func
- return self
- def setter(self, func):
- self.fset = func
- return self
- def deleter(self, func):
- self.fdel = func
- return self
复制代码
你了解了修饰符的本质就明白为什么要 return self 了
就拿你上一个问题的这个类来讲:
- class D:
- def __init__(self):
- self._x = 250
- @PropertyL
- def x(self):
- return self._x
- @x.setter
- def x(self, value):
- self._x = value
- @x.deleter
- def x(self):
- del self._x
复制代码
首先
@PropertyL
def x(self):
相当于 x = PropertyL(x),这时候 x 函数变成了一个 PropertyL 实例
然后
@x.setter
def x(self, value):
相当于 x = s.setter(x),如果你不return self 的话,函数的返回值默认为 None,这时候 x 就成为了 None 了
最后
@x.deleter
def x(self):
相当于 x = x.deleter(x) ,如果 x 成为了 None,None 是没有 deleter 方法的,这里就会出错,
所以要 return self,因为 self 是 PropertyL 实例,PropertyL 实例有 deleter 方法
也就是说 return self 了之后才能支持这样的链式调用
|
|