data_desc_1.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. class CoordinateValue:
  2. def __init__(self, name):
  3. self.storage_name = '_' + name
  4. def __set__(self, instance, value):
  5. setattr(instance, self.storage_name, int(value))
  6. def __get__(self, instance, owner_class):
  7. '''
  8. if instance is None:
  9. print('__get__ called from class')
  10. else:
  11. print(f'__get__ called, instance={instance}, owner_class={owner_class}')
  12. '''
  13. if instance is None:
  14. return self
  15. return getattr(instance, self.storage_name, None)
  16. class Point:
  17. x = CoordinateValue('x')
  18. y = CoordinateValue('y')
  19. def test_point():
  20. p1 = Point()
  21. p1.x = 100
  22. p1.y = 5
  23. print(p1.x, p1.y)
  24. print(p1.__dict__)
  25. p2 = Point()
  26. p2.x = 2
  27. p2.y = 3
  28. print(p2.x, p2.y)
  29. print(p2.__dict__)
  30. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  31. # __set_name__
  32. # Метод срабатывает в процессе создания класса и все!
  33. class StringValidation:
  34. def __init__(self, min_length):
  35. self.min_length = min_length
  36. def __set_name__(self, owner, name):
  37. print(f'__set_name__ called: owner={owner}, attr_name={name}')
  38. self.attribute_name = name
  39. def __get__(self, instance, owner_class):
  40. if instance is None:
  41. return self
  42. else:
  43. print(f'calling __get__ for {self.attribute_name}')
  44. return instance.__dict__.get(self.attribute_name, None)
  45. # key = '_' + self.attribute_name
  46. # return getattr(instance, key, None)
  47. def __set__(self, instance, value):
  48. if not isinstance(value, str):
  49. raise ValueError(f'В атрибут {self.attribute_name} можно \
  50. сохранять только строки.')
  51. if len(value) < self.min_length:
  52. raise ValueError(f'Длина атрибута {self.attribute_name} должна \
  53. быть не меньше {self.min_length} символов')
  54. key = '_' + self.attribute_name
  55. # setattr(instance, key, value)
  56. instance.__dict__[self.attribute_name] = value
  57. class Person:
  58. name = StringValidation(5)
  59. last_name = StringValidation(7)
  60. def main():
  61. p = Person()
  62. p.name = 'Michail'
  63. p.last_name = 'Lermontov'
  64. print(p.name, p.last_name)
  65. try:
  66. p.name = 'M.'
  67. except ValueError as ex:
  68. print(ex)
  69. print(p.name, p.last_name)
  70. if __name__ == '__main__':
  71. main()