Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from abc import ABC, abstractmethod # не може да се създават обекти от абстрактни класове
- class Apartment(ABC): #наследява абстрактния клас
- def __init__(self, id, rooms, baths, square_meters, price):
- self.id = id
- self.rooms = int(rooms)
- self.baths = int(baths)
- self.square_meters = float(square_meters)
- self.price = float(price)
- self.is_taken = False # в началото е незает
- @abstractmethod #абстрактният клас трябва да има поне един абстрактен метод, ако вкараш , вдигнеш инстанция a = Apartment(id, rooms) дава ти нужната грешка, че не може да инстанцираш обект от абстрактен клас с абстрактен метод
- def __str__(self): # string метода трябва да се презапише от нормалните класове, ако не - a = LivingApartment(Apartment) пак хвърля грешката за абстрактен клас
- return f"{self.rooms} rooms place with {self.baths} bathroom/s.\n{self.square_meters} sq. meters for {self.price} lv." #на нов ред \n
- class LivingApartment(Apartment):
- def __init__(self, id, rooms, baths, square_meters, price):
- Apartment.__init__(self, id, rooms, baths, square_meters, price) # на бащата инит, иначе долу гърми място в паметта, няма ги стойностите
- def __str__(self): # в наследниците се презаписва стринг метода от абстрактния клас
- return Apartment.__str__(self) # ако няма ритърн дава грешка за стринг
- class OfficeApartment(Apartment):
- def __init__(self, id, rooms, baths, square_meters, price):
- Apartment.__init__(self, id, rooms, baths, square_meters, price)
- def __str__(self):
- return Apartment.__str__(self)
- data = input()
- apartments_list = []
- while not data == "start_selling":
- try:
- current_app = eval(data)
- apartments_list.append(current_app)
- except Exception as ex:
- print(ex)
- data = input()
- data_list = input().split()
- ids_list = list(map(lambda a: a.id, apartments_list)) #лист от id-tata от апртментслист, вадя апартамент
- while not (data_list[0] == "free" or data_list[0] == "taken"): #задължително трябва да е в скоби, иначе за taken няма да работи
- command = data_list[0]
- id = data_list[1]
- if id in ids_list:
- current_app: Apartment = list(filter(lambda a: a.id == id, apartments_list))[0] #минавам по всички апартаменти, търси дали го има това id, може и да е без : Apartment ще върви по същия начин, това е само за интелисенса да ти покаже пропъртитата
- if current_app.is_taken:
- print(f"Apartment with id - {id} is already taken!")
- elif command == "rent" and isinstance(current_app, LivingApartment): # връща true или false , обект и клас му се подава, слага се класа за който се смята, че ще хвърли грешка
- print(f"Apartment with id - {id} is only for selling!")
- elif command == "buy" and isinstance(current_app, OfficeApartment):
- print(f"Apartment with id - {id} is only for renting!")
- else:
- current_app.is_taken = True
- else:
- print(f"Apartment with id - {id} does not exist!")
- data_list = input().split()
- if data_list[0] == 'taken':
- taken_ap_list = list(filter(lambda a: a.is_taken == True, apartments_list))
- for apartment in sorted(taken_ap_list, key=lambda a: (a.price, -a.square_meters)): # за цифри десендинг низходящо може с минус отпред
- print(apartment)
- elif data_list[0] == 'free':
- taken_ap_list = list(filter(lambda a: a.is_taken == False, apartments_list))
- for apartment in sorted(taken_ap_list, key=lambda a: (-a.price, a.square_meters)):
- print(apartment)
- if len(taken_ap_list) == 0:
- print("No information for this query")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement