书接上回
实现对属性编辑操作的拦截
在上回中,我们谈到在Python中利用基于类的描述器(descriptor)和函数修饰器(decorator),可以实现针对对象属性访问的拦截操作。那么我们很容易想到,既然可以拦截对属性的访问操作,那么也就一定能够实现针对属性的编辑操作的拦截。
下面我先直接上具体的代码:
class my_property:
def __init__(self, *args, **kwargs):
pass
def __get__(self, obj, cls):
return self.func(obj)
def setter(self, fset):
self.fset = fset
return self
def __set__(self, obj, value):
if not self.fset:
raise AttributeError("can't set attribute")
return self.fset(obj, value)
def __call__(self, func, *args, **kwargs):
self.func = func
return self
class SysOptions:
def __init__(self):
self.cache = dict()
@my_property()
def website_base_url(self):
if 'website_base_url' in self.cache:
return self.cache['website_base_url']
else:
return None
@website_base_url.setter
def website_base_url(self, value):
self.cache['website_base_url'] = value
return value
mySys = SysOptions()
# 输出None
print(mySys.website_base_url)
# 输出"http://www.jiangnangame.com"
mySys.website_base_url = 'http://www.jiangnangame.com'
print(mySys.website_base_url)
这个代码对于认真看了上篇文章的同学来说难度应该不大,因此这里我仅作简单的分析。
为了实现对属性编辑操作的拦截,我这里在描述器类my_property中定义了setter
和__set__
这两个方法。