|
@@ -0,0 +1,111 @@
|
|
|
+'''
|
|
|
+Вычисляемые свойства
|
|
|
+Если вам нужен атрибут, который будет вычислять
|
|
|
+свое значение каждый раз динамически при доступе к нему, то 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()
|