tit
asaunknown
python
3 years ago
3.2 kB
8
Indexable
"""
Klasa Składnik zawiera pola nazwa składnika, waga składnika wyrażona w kilogramach oraz cena za kilogram.
Utwórz dla tej klasy settery i gettery.
Nazwa składnika musi składać się tylko i wyłącznie z małych liter.
Waga składnika oraz cena składnika to zmienna typu double o wartościach większych od zera.
Dodatkowo zaimplementuj konstruktor bezargumentowy – dane pobierane od użytkownika oraz konstruktor argumentowy.
Klasa Produkt zawiera tablicę obiektów klasy Składnik.
Konstruktor bezargumentowy klasy Produkt prosi użytkownika o podanie liczby elementów tablicy
oraz pobiera wartości pól dla kolejnych składników.
Dodatkowo klasa zawiera metodę obliczającą cenę produktu,
która jest wyznaczona jako suma cen poszczególnych składników z tablicy
powiększona o 15% marży. Przetestuj działanie klas w funkcji głównej programu.
"""
from decimal import Decimal
import re
class Component:
def __init__(self):
self.name = Attributes.get_name()
self.weight = Attributes.get_weight()
self.price = Attributes.get_price()
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = Validators.validate_name(name)
@property
def weight(self):
return self.__weight
@weight.setter
def weight(self, weight):
self.__weight = Validators.validate_if_above_zero(weight)
@property
def price(self):
return self.__price
@price.setter
def price(self, price):
self.__price = Validators.validate_if_above_zero(price)
class Attributes:
@staticmethod
def get_name() -> str:
while not re.match('[a-z]+$', (input_val := input(f'Name:\n'))):
print(f'Only small letters')
return input_val
@staticmethod
def get_weight() -> float:
while not (input_val := input(f'Weight:\n')).isnumeric():
print(f'not a number')
return float(input_val)
@staticmethod
def get_price() -> Decimal:
while not (input_val := input(f'Price:\n')).isnumeric():
print(f'not a number')
return Decimal(f'{input_val}')
class Validators:
@staticmethod
def validate_name(text: str) -> str:
if re.match('[a-z]+$', text):
return text
else:
raise ValueError('only lower case acceptable')
@staticmethod
def validate_if_above_zero(num: Decimal | float) -> Decimal | float:
if num <= 0:
ValueError('number should be above zero')
else:
return num
class Product:
def __init__(self):
components_number = self.get_num_of_components('provide components number')
self.components = [Component() for _ in range(0, components_number)]
def get_num_of_components(self, message: str):
while not re.match(r'\d+', text := input(f'{message}:\n')):
print('Value must be a positive integer')
return int(text)
def main() -> None:
prod = Product()
if __name__ == '__main__':
main()
Editor is loading...