ex_1.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. class ColourComponent:
  2. def __init__(self, start, end):
  3. self.start = start
  4. self.end = end
  5. def __get__(self, instance, owner_class):
  6. # print(f'__get__ called')
  7. return int(instance.hex[self.start:self.end], 16)
  8. def __set__(self, instance, value):
  9. # print('__set__ called')
  10. pass
  11. class Colour:
  12. r = ColourComponent(1, 3)
  13. g = ColourComponent(3, 5)
  14. b = ColourComponent(5, 7)
  15. def __init__(self, hex):
  16. self.hex = hex
  17. def test_colour():
  18. colour = Colour('#ff8823')
  19. print(colour.r)
  20. print(colour.g)
  21. print(colour.b)
  22. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23. class MaxLengthAttribute:
  24. def __get__(self, instance, owner_class):
  25. if instance.__dict__ == {}:
  26. return None
  27. return sorted(instance.__dict__.keys(), key= lambda x: (len(x), x), reverse=True)[0]
  28. class MyClass:
  29. max_length_attribute = MaxLengthAttribute()
  30. class JustClass:
  31. max_atr = MaxLengthAttribute()
  32. def test_len():
  33. # obj = MyClass()
  34. # obj.name = "Vasiliy"
  35. # obj.city = "Saint Peterburg"
  36. # obj.country = "Rus"
  37. # print(obj.max_length_attribute)
  38. obj = JustClass()
  39. obj.mock = 15
  40. obj.city = "Saint Peterburg"
  41. obj.name = "Vasiliy"
  42. obj.door = 'wood'
  43. print(obj.max_atr)
  44. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  45. class RangeValidator:
  46. def __init__(self, start, end):
  47. self.start = start
  48. self.end = end
  49. self.value = 0
  50. def __get__(self, instance, owner_class):
  51. pass
  52. def __set__(self, instance, value):
  53. if not isinstance(value, (int, float)):
  54. raise TypeError('Неправильный тип данных')
  55. if value < self.start or value > self.end:
  56. raise ValueError(f'Значение должно быть между {self.start} и {self.end}')
  57. self.value = value
  58. class Temperature:
  59. celsius = RangeValidator(-273.15, 1000)
  60. def test_range_validator():
  61. temp = Temperature()
  62. try:
  63. temp.celsius = [1, 2]
  64. except TypeError as ex:
  65. print(ex)
  66. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  67. class StringValidation:
  68. def __init__(self, min_length=None, max_length=None,
  69. exclude_chars=None, is_same_register=False):
  70. self.min_length = min_length
  71. self.max_length = max_length
  72. self.exclude_chars = exclude_chars
  73. self.is_same_register = is_same_register
  74. def __set_name__(self, owner_class, attribute_name):
  75. self.attribute_name = attribute_name
  76. def __set__(self, instance, value):
  77. if not isinstance(value, str):
  78. raise ValueError(f'В атрибут {self.attribute_name} можно сохранять только строки')
  79. if self.min_length is not None:
  80. if len(value) < self.min_length:
  81. raise ValueError(f'Длина атрибута {self.attribute_name} должна '
  82. f'быть не меньше {self.min_length} символов')
  83. if self.max_length is not None:
  84. if len(value) > self.max_length:
  85. raise ValueError(f'Длина атрибута {self.attribute_name} должна '
  86. f'быть не больше {self.max_length} символов')
  87. if self.exclude_chars is not None:
  88. for char in self.exclude_chars:
  89. if char in value:
  90. raise ValueError(f'Имеются недопустимые символы в атрибуте {self.attribute_name}')
  91. if self.is_same_register == True:
  92. if not value.isupper() and not value.islower():
  93. raise ValueError(f'Все буквы должны быть в одном регистре в атрибуте {self.attribute_name}')
  94. instance.__dict__[self.attribute_name] = value
  95. def __get__(self, instance, owner_class):
  96. if instance is None:
  97. return self
  98. else:
  99. print(f'calling __get__ for {self.attribute_name}')
  100. return instance.__dict__.get(self.attribute_name, None)
  101. class Person:
  102. '''
  103. name = StringValidation()
  104. last_name = StringValidation()
  105. '''
  106. '''
  107. name = StringValidation(min_length=10, exclude_chars='tyuio')
  108. last_name = StringValidation(max_length=5)
  109. '''
  110. name = StringValidation(is_same_register=True, exclude_chars='tyur')
  111. last_name = StringValidation(max_length=10, is_same_register=True)
  112. def test_string_validation():
  113. '''
  114. p = Person()
  115. p.name = 'Michail'
  116. p.last_name = 'Lermontov'
  117. print(p.name, p.last_name)
  118. '''
  119. '''
  120. p = Person()
  121. try:
  122. p.name = 'Michail Second'
  123. except ValueError as ex:
  124. print(ex)
  125. try:
  126. p.last_name = 'Lermontov'
  127. except ValueError as ex:
  128. print(ex)
  129. print(p.name, p.last_name)
  130. '''
  131. p = Person()
  132. try:
  133. p.name = 'Michail Second'
  134. except ValueError as ex:
  135. print(ex)
  136. try:
  137. p.last_name = 'LERMONTOV'
  138. except ValueError as ex:
  139. print(ex)
  140. print(p.name, p.last_name)
  141. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  142. if __name__ == '__main__':
  143. # test_colour()
  144. # test_len()
  145. # test_range_validator()
  146. test_string_validation()