property.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. class property(object):
  2. "Emulate PyProperty_Type() in Objects/descrobject.c"
  3. def __init__(self, fget=None, fset=None, fdel=None, doc=None):
  4. self.fget = fget
  5. self.fset = fset
  6. self.fdel = fdel
  7. if doc is None and fget is not None:
  8. if hasattr(fget, '__doc__'):
  9. doc = fget.__doc__
  10. else:
  11. doc = None
  12. self.__doc__ = doc
  13. def __get__(self, obj, objtype=None):
  14. if obj is None:
  15. return self
  16. if self.fget is None:
  17. raise AttributeError("unreadable attribute")
  18. return self.fget(obj)
  19. def __set__(self, obj, value):
  20. if self.fset is None:
  21. raise AttributeError("can't set attribute")
  22. self.fset(obj, value)
  23. def __delete__(self, obj):
  24. if self.fdel is None:
  25. raise AttributeError("can't delete attribute")
  26. self.fdel(obj)
  27. def getter(self, fget):
  28. return type(self)(fget, self.fset, self.fdel, self.__doc__)
  29. def setter(self, fset):
  30. return type(self)(self.fget, fset, self.fdel, self.__doc__)
  31. def deleter(self, fdel):
  32. return type(self)(self.fget, self.fset, fdel, self.__doc__)