''' Вычисляемые свойства Если вам нужен атрибут, который будет вычислять свое значение каждый раз динамически при доступе к нему, то property — это то, что вам нужно. Такие атрибуты обычно называются вычисляемыми атрибутами. ''' import time class Square: def __init__(self, s): self.__side = s self.__area = None @property def side(self): return self.__side @side.setter def side(self, value): self.side = value self.__area = None @property def area(self): if self.__area is None: print('Calculate area...') time.sleep(0.5) self.__area = self.side ** 2 return self.__area def test_1(): sq = Square(4) print(sq.area) print(sq.area) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class Colour: def __init__(self, colour): self.colour = colour @property def red(self): return int(self.colour[1:3], base=16) @property def green(self): return int(self.colour[3:5], base=16) @property def blue(self): return int(self.colour[5:7], base=16) def test_2(): colour = Colour("#aacce4") print(colour.red) print(colour.green) print(colour.blue) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class Ingredient: def __init__(self, name, weight, price): self.name = name self.weight = weight self.price = price # стоимость за 100гр @property def cost(self): return self.weight * self.price/100 class Pizza: def __init__(self, name, ingredients=None): self.name = name if ingredients is None: self.ingredients = [] else: self.ingredients = ingredients @property def cost(self): s = 0 for x in self.ingredients: s += x.cost return s + 100 def test_3(): chicken = Ingredient('chicken', 200, 80) mozzarella = Ingredient('mozzarella', 300, 110) sauce_bbq = Ingredient('sauce bbq', 150, 70) red_onion = Ingredient('red onion', 150, 50) print('Цена курицы', chicken.cost) print('Цена моцарелы', mozzarella.cost) print('Цена соуса', sauce_bbq.cost) print('Цена красного лука', red_onion.cost) barbecue = Pizza('BBQ', [chicken, mozzarella, sauce_bbq, red_onion]) print('Стоимость пиццы BBQ', barbecue.cost) def main(): # test_1() # test_2() test_3() if __name__ == '__main__': main()