Source code for do_mpc.tools._indexedproperty
from functools import wraps
[docs]
class IndexedProperty(object):
"""
Based on the python implementation of the regular property() decorator.
See for example: https://docs.python.org/3/howto/descriptor.html
The main tweak is __get__, where the above mentionned implementation
directly calls the fget function. We instead return the class instance itself,
where the parent class is now added to the class dict.
Since the call is followed by brackets, immediatly the __getitem__ or __setitem__
methods are invoked. These methods are lacking the parent class but it now
exists in the scope of the property instance.
We can therefore call fget or fset with the parent class.
"""
def __init__(self, fget=None, fset=None, doc=None):
self.fget = fget
self.fset = fset
if doc is None and fget is not None:
doc = fget.__doc__
self.__doc__ = doc
def __get__(self, obj, objtype=None):
self.obj = obj
return self
def __getitem__(self,ind):
return self.fget(self.obj,ind)
def __setitem__(self,ind, val):
return self.fset(self.obj,ind,val)
def getter(self, fget):
@wraps(fget)
def wrapper(obj,*args, **kwargs):
return fget(obj, *args, **kwargs)
self.fget = wrapper
return type(self)(wrapper, self.fset, self.__doc__)
def setter(self, fset):
def wrapper(obj, *args, **kwargs):
return fset(obj, *args, **kwargs)
self.fset = wrapper
return type(self)(self.fget, wrapper, self.__doc__)