dataclass_3.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. from dataclasses import dataclass, field
  2. import random
  3. import string
  4. @dataclass
  5. class Person:
  6. first_name: str
  7. last_name: str
  8. age: int = field(default=20)
  9. full_name: str = field(init=False)
  10. def __post_init__(self):
  11. self.full_name = f'{self.first_name} {self.last_name}'
  12. self.is_programmer = True
  13. def test_1():
  14. artem = Person('Artem', 'Egorov')
  15. print(artem)
  16. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  17. # Сортировка
  18. @dataclass(order=True)
  19. class PersonSort:
  20. sort_index: int = field(init=False, repr=False)
  21. name: str
  22. age: int
  23. weight: int = 190
  24. def __post_init__(self):
  25. self.sort_index = (self.weight, self.age)
  26. def test_2():
  27. persons = [
  28. PersonSort('Иван', 25, 200),
  29. PersonSort('Петр', 30, 150),
  30. PersonSort('Кирилл', 35, 150),
  31. PersonSort('Борис', 20, 200),
  32. PersonSort('Алексей', 15, 200),
  33. PersonSort('Дмитрий', 11, 175),
  34. ]
  35. print(*sorted(persons), sep='\n')
  36. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  37. # Наследование dataclass
  38. # Если родительский класс имеет поле или несколько полей по умолчанию, то
  39. # все поля в дочернем классе должны иметь значения по умолчанию.
  40. @dataclass
  41. class Person:
  42. first_name: str
  43. last_name: str
  44. age: int = field(default=20)
  45. '''
  46. @dataclass
  47. class Student(Person):
  48. course: int = 1
  49. stipend: int = 1000
  50. '''
  51. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  52. # Задание на сортировку
  53. @dataclass(order=True)
  54. class Athlet:
  55. sort_index : float = field(init=False, repr=False)
  56. name: str
  57. coefficient: float = field(repr=False)
  58. scores: list = field(default_factory=list, repr=False)
  59. def __post_init__(self):
  60. self.sort_index = self.coefficient * sum(self.scores)/len(self.scores)
  61. print(self.sort_index)
  62. def test_3():
  63. sportsmans = [
  64. Athlet('Иван', 1.5, [9.0, 8.0, 7.0]),
  65. Athlet('Петр', 1.0, [10.0, 9.0, 8.0]),
  66. Athlet('Алексей', 1.2, [8.0, 7.0, 6.0])
  67. ]
  68. print(f"Победитель соревнований: {max(sportsmans)}")
  69. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  70. alphabet = string.ascii_uppercase + string.digits
  71. def generate_guid():
  72. guid = ''.join(random.choices(alphabet, k=15))
  73. return guid
  74. @dataclass(order=True)
  75. class Student:
  76. sort_index : int = field(init=False, repr=False)
  77. first_name: str
  78. last_name: str
  79. tuition: int = field(default=0, repr=False)
  80. guid: str = field(init=False, repr=False)
  81. email: str = field(init=False)
  82. def __post_init__(self):
  83. self.sort_index = (self.tuition, self.last_name, self.first_name)
  84. self.guid = generate_guid()
  85. self.email = self.first_name.lower() + '.' + self.last_name.lower() + '@uni.edu'
  86. def test_4():
  87. jane = Student('Jane', 'Lee')
  88. julia = Student('Julia', 'Doe')
  89. jake = Student('Jake', 'Langdon')
  90. joy = Student('Joy', 'Smith')
  91. print(*sorted([jane, julia, jake, joy]), sep='\n')
  92. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  93. @dataclass
  94. class Promo:
  95. code : str
  96. discount : int = field(default=0)
  97. goods : list = field(default_factory=list)
  98. @dataclass
  99. class Product:
  100. name: str
  101. price: float = field(repr=False)
  102. book = Product('Книга', 100.0)
  103. usb = Product('Флешка', 50.0)
  104. pen = Product('Ручка', 10.0)
  105. ACTIVE_PROMO = [
  106. Promo('new', 20, [pen]),
  107. Promo('all_goods', 30),
  108. Promo('sale', 50, [book, usb]),
  109. ]
  110. @dataclass
  111. class Cart:
  112. products: list = field(default_factory=list)
  113. discount: int = field(default=0, init=False, repr=False)
  114. discount_type: str = field(default='', init=False, repr=False)
  115. # product_promo: str = field(default='', init=False, repr=False)
  116. products_promo: list = field(default_factory=list, init=False, repr=False)
  117. def add_product(self, product, quantity=1):
  118. for i in range(quantity):
  119. self.products.append(product)
  120. def get_total(self):
  121. '''
  122. if self.product_promo != '':
  123. s = sum([x.price if x.name != self.product_promo else
  124. x.price*(1 - self.discount/100) for x in self.products])
  125. return s
  126. '''
  127. if self.products_promo != []:
  128. s = sum([x.price if x.name not in self.products_promo else
  129. x.price*(1 - self.discount/100) for x in self.products])
  130. return s
  131. s = sum([x.price for x in self.products])
  132. if self.discount == 0:
  133. return s
  134. else:
  135. return s - s/100*self.discount
  136. def apply_discount(self, value):
  137. if value < 1 or value > 100:
  138. raise ValueError('Неправильное значение скидки')
  139. self.discount = value
  140. self.discount_type = 'disc'
  141. def apply_promo(self, code):
  142. data = {x.code:x.discount for x in ACTIVE_PROMO}
  143. foo = {x.code:x.goods for x in ACTIVE_PROMO}
  144. if code not in data.keys():
  145. print(f'Промокода {code} не существует')
  146. else:
  147. print(f'Промокод {code} успешно применился')
  148. self.discount = data[code]
  149. if (foo[code] != []):
  150. # self.product_promo = foo[code][0].name
  151. for x in foo[code]:
  152. self.products_promo.append(x.name)
  153. # print(self.products_promo)
  154. def test_5():
  155. pass
  156. def test_6():
  157. cart = Cart()
  158. cart.add_product(book, 10)
  159. cart.add_product(pen)
  160. cart.add_product(book, 5)
  161. cart.add_product(usb, 5)
  162. cart.add_product(usb, 15)
  163. cart.add_product(pen, 2)
  164. print(cart.get_total())
  165. # Применение промокода в 50% на книги и флешки
  166. cart.apply_promo('sale')
  167. print(cart.get_total())
  168. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  169. def main():
  170. # test_1()
  171. # test_2()
  172. # test_3()
  173. # test_4()
  174. # test_5()
  175. test_6()
  176. if __name__ == '__main__':
  177. main()