ex_3.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. class CustomProperty:
  2. def __init__(self, fget=None, fset=None):
  3. self.fget = fget
  4. self.fset = fset
  5. def __set_name__(self, owner_class, prop_name):
  6. self.prop_name = prop_name
  7. def __get__(self, instance, owner_class):
  8. print('__get__ called...')
  9. if instance is None:
  10. return self
  11. if self.fget is None:
  12. raise AttributeError(f'{self.prop_name} is not readble.')
  13. return self.fget(instance)
  14. def __set__(self, instance, value):
  15. print('__set__ called...')
  16. if self.fset is None:
  17. raise AttributeError(f'{self.prop_name} is not writable.')
  18. self.fset(instance, value)
  19. def setter(self, fset):
  20. self.fset = fset
  21. return self
  22. class Person:
  23. @CustomProperty
  24. def first_name(self):
  25. return getattr(self, '_first_name', None)
  26. @first_name.setter
  27. def first_name(self, value):
  28. self._first_name = value
  29. @CustomProperty
  30. def last_name(self):
  31. return getattr(self, '_last_name', None)
  32. @last_name.setter
  33. def last_name(self, value):
  34. self._last_name = value
  35. def test():
  36. p = Person()
  37. print(p.__dict__)
  38. p.name = 'Artem'
  39. print(p.name)
  40. print(p.__dict__)
  41. # пробуем затемнить дескриптор
  42. p.__dict__['name'] = 'Egor'
  43. print(p.name)
  44. def main():
  45. test()
  46. if __name__ == '__main__':
  47. main()