Guest User

Untitled

a guest
Aug 23rd, 2019
85
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from abc import ABC, abstractmethod # не може да се създават обекти от абстрактни класове
  2.  
  3.  
  4.  
  5. class Apartment(ABC): #наследява абстрактния клас
  6. def __init__(self, id, rooms, baths, square_meters, price):
  7. self.id = id
  8. self.rooms = int(rooms)
  9. self.baths = int(baths)
  10. self.square_meters = float(square_meters)
  11. self.price = float(price)
  12. self.is_taken = False # в началото е незает
  13.  
  14. @abstractmethod #абстрактният клас трябва да има поне един абстрактен метод, ако вкараш , вдигнеш инстанция a = Apartment(id, rooms) дава ти нужната грешка, че не може да инстанцираш обект от абстрактен клас с абстрактен метод
  15. def __str__(self): # string метода трябва да се презапише от нормалните класове, ако не - a = LivingApartment(Apartment) пак хвърля грешката за абстрактен клас
  16. return f"{self.rooms} rooms place with {self.baths} bathroom/s.\n{self.square_meters} sq. meters for {self.price} lv." #на нов ред \n
  17.  
  18.  
  19. class LivingApartment(Apartment):
  20. def __init__(self, id, rooms, baths, square_meters, price):
  21. Apartment.__init__(self, id, rooms, baths, square_meters, price) # на бащата инит, иначе долу гърми място в паметта, няма ги стойностите
  22.  
  23. def __str__(self): # в наследниците се презаписва стринг метода от абстрактния клас
  24. return Apartment.__str__(self) # ако няма ритърн дава грешка за стринг
  25.  
  26.  
  27. class OfficeApartment(Apartment):
  28. def __init__(self, id, rooms, baths, square_meters, price):
  29. Apartment.__init__(self, id, rooms, baths, square_meters, price)
  30.  
  31. def __str__(self):
  32. return Apartment.__str__(self)
  33.  
  34.  
  35. data = input()
  36. apartments_list = []
  37.  
  38. while not data == "start_selling":
  39. try:
  40. current_app = eval(data)
  41. apartments_list.append(current_app)
  42. except Exception as ex:
  43. print(ex)
  44.  
  45. data = input()
  46.  
  47. data_list = input().split()
  48. ids_list = list(map(lambda a: a.id, apartments_list)) #лист от id-tata от апртментслист, вадя апартамент
  49.  
  50. while not (data_list[0] == "free" or data_list[0] == "taken"): #задължително трябва да е в скоби, иначе за taken няма да работи
  51. command = data_list[0]
  52. id = data_list[1]
  53.  
  54. if id in ids_list:
  55. current_app: Apartment = list(filter(lambda a: a.id == id, apartments_list))[0] #минавам по всички апартаменти, търси дали го има това id, може и да е без : Apartment ще върви по същия начин, това е само за интелисенса да ти покаже пропъртитата
  56. if current_app.is_taken:
  57. print(f"Apartment with id - {id} is already taken!")
  58. elif command == "rent" and isinstance(current_app, LivingApartment): # връща true или false , обект и клас му се подава, слага се класа за който се смята, че ще хвърли грешка
  59. print(f"Apartment with id - {id} is only for selling!")
  60. elif command == "buy" and isinstance(current_app, OfficeApartment):
  61. print(f"Apartment with id - {id} is only for renting!")
  62. else:
  63. current_app.is_taken = True
  64. else:
  65. print(f"Apartment with id - {id} does not exist!")
  66.  
  67. data_list = input().split()
  68.  
  69. if data_list[0] == 'taken':
  70. taken_ap_list = list(filter(lambda a: a.is_taken == True, apartments_list))
  71. for apartment in sorted(taken_ap_list, key=lambda a: (a.price, -a.square_meters)): # за цифри десендинг низходящо може с минус отпред
  72. print(apartment)
  73.  
  74. elif data_list[0] == 'free':
  75. taken_ap_list = list(filter(lambda a: a.is_taken == False, apartments_list))
  76. for apartment in sorted(taken_ap_list, key=lambda a: (-a.price, a.square_meters)):
  77. print(apartment)
  78.  
  79. if len(taken_ap_list) == 0:
  80. print("No information for this query")
RAW Paste Data