| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 | from dataclasses import dataclass, fieldimport randomimport string@dataclassclass Person:    first_name: str    last_name: str    age: int = field(default=20)    full_name: str = field(init=False)    def __post_init__(self):        self.full_name = f'{self.first_name} {self.last_name}'        self.is_programmer = True        def test_1():    artem = Person('Artem', 'Egorov')    print(artem)# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# Сортировка@dataclass(order=True)class PersonSort:    sort_index: int = field(init=False, repr=False)    name: str    age: int    weight: int = 190    def __post_init__(self):        self.sort_index = (self.weight, self.age)def test_2():    persons = [        PersonSort('Иван', 25, 200),        PersonSort('Петр', 30, 150),        PersonSort('Кирилл', 35, 150),        PersonSort('Борис', 20, 200),        PersonSort('Алексей', 15, 200),        PersonSort('Дмитрий', 11, 175),    ]    print(*sorted(persons), sep='\n')# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# Наследование dataclass# Если родительский класс имеет поле или несколько полей по умолчанию, то# все поля в дочернем классе должны иметь значения по умолчанию.@dataclassclass Person:    first_name: str    last_name: str    age: int = field(default=20)'''@dataclassclass Student(Person):    course: int = 1    stipend: int = 1000'''# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# Задание на сортировку@dataclass(order=True)class Athlet:    sort_index : float = field(init=False, repr=False)    name: str    coefficient: float = field(repr=False)    scores: list = field(default_factory=list, repr=False)        def __post_init__(self):        self.sort_index = self.coefficient * sum(self.scores)/len(self.scores)        print(self.sort_index)def test_3():    sportsmans = [    Athlet('Иван', 1.5, [9.0, 8.0, 7.0]),    Athlet('Петр', 1.0, [10.0, 9.0, 8.0]),    Athlet('Алексей', 1.2, [8.0, 7.0, 6.0])    ]    print(f"Победитель соревнований: {max(sportsmans)}")# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~alphabet = string.ascii_uppercase + string.digitsdef generate_guid():    guid = ''.join(random.choices(alphabet, k=15))    return guid@dataclass(order=True)class Student:    sort_index : int = field(init=False, repr=False)    first_name: str    last_name: str    tuition: int = field(default=0, repr=False)    guid: str = field(init=False, repr=False)    email: str = field(init=False)    def __post_init__(self):        self.sort_index = (self.tuition, self.last_name, self.first_name)        self.guid = generate_guid()        self.email = self.first_name.lower() + '.' + self.last_name.lower() + '@uni.edu'def test_4():    jane = Student('Jane', 'Lee')    julia = Student('Julia', 'Doe')    jake = Student('Jake', 'Langdon')    joy = Student('Joy', 'Smith')    print(*sorted([jane, julia, jake, joy]), sep='\n')# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@dataclassclass Promo:    code : str    discount : int = field(default=0)    goods : list = field(default_factory=list)@dataclassclass Product:    name: str    price: float = field(repr=False)book = Product('Книга', 100.0)usb = Product('Флешка', 50.0)pen = Product('Ручка', 10.0)ACTIVE_PROMO = [    Promo('new', 20, [pen]),    Promo('all_goods', 30),    Promo('sale', 50, [book, usb]),]@dataclassclass Cart:    products: list = field(default_factory=list)    discount: int = field(default=0, init=False, repr=False)    discount_type: str = field(default='', init=False, repr=False)    # product_promo: str = field(default='', init=False, repr=False)    products_promo: list = field(default_factory=list, init=False, repr=False)    def add_product(self, product, quantity=1):        for i in range(quantity):            self.products.append(product)    def get_total(self):        '''        if self.product_promo != '':            s = sum([x.price if x.name != self.product_promo else             x.price*(1 - self.discount/100) for x in self.products])            return s        '''        if self.products_promo != []:            s = sum([x.price if x.name not in self.products_promo else             x.price*(1 - self.discount/100) for x in self.products])            return s        s = sum([x.price for x in self.products])        if self.discount == 0:            return s        else:            return s - s/100*self.discount    def apply_discount(self, value):        if value < 1 or value > 100:            raise ValueError('Неправильное значение скидки')        self.discount = value        self.discount_type = 'disc'    def apply_promo(self, code):        data = {x.code:x.discount for x in ACTIVE_PROMO}        foo = {x.code:x.goods for x in ACTIVE_PROMO}        if code not in data.keys():            print(f'Промокода {code} не существует')        else:            print(f'Промокод {code} успешно применился')            self.discount = data[code]            if (foo[code] != []):                # self.product_promo = foo[code][0].name                for x in foo[code]:                    self.products_promo.append(x.name)                # print(self.products_promo)def test_5():    passdef test_6():    cart = Cart()    cart.add_product(book, 10)    cart.add_product(pen)    cart.add_product(book, 5)    cart.add_product(usb, 5)    cart.add_product(usb, 15)    cart.add_product(pen, 2)    print(cart.get_total())    # Применение промокода в 50% на книги и флешки    cart.apply_promo('sale')    print(cart.get_total())# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~def main():    # test_1()    # test_2()    # test_3()    # test_4()    # test_5()    test_6()if __name__ == '__main__':    main()
 |