Skip to content

Instantly share code, notes, and snippets.

@Kroisse
Created August 28, 2013 08:00
Show Gist options
  • Save Kroisse/6363281 to your computer and use it in GitHub Desktop.
Save Kroisse/6363281 to your computer and use it in GitHub Desktop.
Python indexer sample like C#
class indexer(object):
def __init__(self, getter, setter=None, deleter=None, doc=None):
self._getter = getter
self._setter = setter
self._deleter = deleter
self.__doc__ = doc or getter.__doc__
self._delegates = {}
def setter(self, func):
self._setter = func
return self
def deleter(self, func):
self._deleter = func
return self
def __get__(self, instance, owner):
if instance is None:
return self
else:
if instance not in self._delegates:
self._delegates[instance] = ListLike(instance, self._getter, self._setter, self._deleter)
return self._delegates[instance]
def __set__(self, instance, value):
raise NotImplementedError()
def __delete__(self, instance):
raise NotImplementedError()
class ListLike(object):
def __init__(self, instance, getter, setter, deleter):
self.instance = instance
self.getter = getter
self.setter = setter
self.deleter = deleter
def __getitem__(self, key):
return self.getter(instance, key)
def __setitem__(self, key, value):
return self.setter(instance, key, value)
def __delitem__(self, key):
return self.deleter(instance, key)
class Sample(object):
@indexer
def a(self, key):
return key
@indexer.setter
def a(self, key, value):
print key, value
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment