mirror of
https://github.com/DavidGailleton/42-Piscine_Python.git
synced 2026-03-14 13:16:53 +01:00
195 lines
6.5 KiB
Python
195 lines
6.5 KiB
Python
class Plant:
|
|
name: str
|
|
height: int
|
|
total_growth: int
|
|
__kind: str
|
|
|
|
def __init__(self, name: str, height: int) -> None:
|
|
"""Init plant with his value"""
|
|
self.name = name
|
|
self.height = height
|
|
self.__kind = "regular"
|
|
self.total_growth = 0
|
|
|
|
def get_kind(self) -> str:
|
|
"""Return __kind value"""
|
|
return self.__kind
|
|
|
|
def set_kind(self, kind: str) -> None:
|
|
"""Set __kind value"""
|
|
self.__kind = kind
|
|
|
|
def grow(self) -> None:
|
|
"""Grow the plant"""
|
|
self.height = self.height + 1
|
|
self.total_growth += 1
|
|
|
|
|
|
class FloweringPlant(Plant):
|
|
color: str
|
|
blooming: bool = False
|
|
|
|
def bloom(self) -> None:
|
|
"""Set blooming to true"""
|
|
self.blooming = True
|
|
print(self.name, "is blooming beautifully !")
|
|
|
|
def __init__(self, name: str, height: int, color: str) -> None:
|
|
"""Init Flowering plant with his value"""
|
|
super().__init__(name=name, height=height)
|
|
self.color = color
|
|
self.set_kind("flowering")
|
|
|
|
|
|
class PrizeFlower(FloweringPlant):
|
|
prize: int
|
|
|
|
def __init__(self, name: str, height: int, color: str, prize: int) -> None:
|
|
"""Init prize flower with his value"""
|
|
super().__init__(name=name, height=height, color=color)
|
|
self.prize = prize
|
|
self.set_kind("prize")
|
|
|
|
|
|
class GardenManager:
|
|
gardens: dict[str, list[Plant | FloweringPlant | PrizeFlower]]
|
|
nb_gardens: int
|
|
|
|
def __init__(self) -> None:
|
|
"""Init garden manager"""
|
|
self.gardens = {}
|
|
self.nb_gardens = 0
|
|
|
|
class GardenStats:
|
|
@classmethod
|
|
def garden_report(cls,
|
|
garden: list[Plant |
|
|
FloweringPlant |
|
|
PrizeFlower] | None) -> None:
|
|
"""Start all garden report"""
|
|
if garden is not None:
|
|
cls.flower_in_garden(garden)
|
|
print("")
|
|
cls.added_plant_report(garden)
|
|
cls.plants_in_garden(garden)
|
|
else:
|
|
print("Garden not provide")
|
|
|
|
@staticmethod
|
|
def flower_in_garden(garden: list[Plant |
|
|
FloweringPlant |
|
|
PrizeFlower]) -> None:
|
|
"""List flower in garden and display their status"""
|
|
for n in garden:
|
|
print("-", n.name + ":", end=" ")
|
|
print(n.height, "cm", end="")
|
|
if n.get_kind() == "flowering" or n.get_kind() == "prize":
|
|
print(",", n.color, "flowers", end="")
|
|
if n.blooming:
|
|
print(" (blooming)", end="")
|
|
if n.get_kind() == "prize":
|
|
print(", Prize points:", n.prize, end="")
|
|
print("")
|
|
|
|
@staticmethod
|
|
def added_plant_report(garden: list[Plant |
|
|
FloweringPlant |
|
|
PrizeFlower]) -> None:
|
|
"""Report number of plant added to garden"""
|
|
total_growth = 0
|
|
total_plants = 0
|
|
for n in garden:
|
|
total_plants += 1
|
|
total_growth += n.total_growth
|
|
print(f"Plants added: {total_plants},",
|
|
f"Total growth: {total_growth}cm")
|
|
|
|
@staticmethod
|
|
def plants_in_garden(garden: list[Plant |
|
|
FloweringPlant |
|
|
PrizeFlower]) -> None:
|
|
"""Report number of plant by types"""
|
|
nb_regular = 0
|
|
nb_flowering = 0
|
|
nb_prize = 0
|
|
for n in garden:
|
|
if n.get_kind() == "regular":
|
|
nb_regular += 1
|
|
elif n.get_kind() == "flowering":
|
|
nb_flowering += 1
|
|
elif n.get_kind() == "prize":
|
|
nb_prize += 1
|
|
print(f"Plant types: {nb_regular} regular,",
|
|
f"{nb_flowering} flowering, {nb_prize} prize flowers")
|
|
|
|
def get_nb_gardens(self) -> int:
|
|
"""return the number of garden in the manager"""
|
|
return self.nb_gardens
|
|
|
|
def get_garden(self, garden: str) -> list[Plant |
|
|
FloweringPlant |
|
|
PrizeFlower] | None:
|
|
"""Return the plant list of the garden name provide if exist"""
|
|
if garden in self.gardens:
|
|
return self.gardens[garden]
|
|
else:
|
|
return None
|
|
|
|
def add_plant(self, garden: str, new_plant: Plant |
|
|
FloweringPlant |
|
|
PrizeFlower) -> None:
|
|
"""Add one plant to the garden if exist"""
|
|
if garden in self.gardens:
|
|
i = 0
|
|
for n in self.gardens[garden]:
|
|
i = i + 1
|
|
new: list[Plant |
|
|
FloweringPlant |
|
|
PrizeFlower] = [Plant("", 0)] * (i + 1)
|
|
j = 0
|
|
while j < i:
|
|
new[j] = self.gardens[garden][j]
|
|
j = j + 1
|
|
new[i] = new_plant
|
|
self.gardens[garden] = new
|
|
print("Added ", new_plant.name, " to ",
|
|
garden, "'s garden", sep="")
|
|
else:
|
|
print("Garden not found")
|
|
|
|
def create_garden_network(self, garden_name: str) -> None:
|
|
"""Create a garden by name provide if it not exist"""
|
|
if garden_name in self.gardens:
|
|
print("garden already exist")
|
|
else:
|
|
self.gardens[garden_name] = []
|
|
self.nb_gardens += 1
|
|
|
|
def grow_all(self, garden: str) -> None:
|
|
"""Make all plant of one garden to grow"""
|
|
if garden in self.gardens:
|
|
print(f"{garden} is helping all plants grow...")
|
|
for n in self.gardens[garden]:
|
|
print(f"{n.name} grew 1cm")
|
|
n.grow()
|
|
else:
|
|
print("Garden not found")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
oak = Plant("oak tree", 101)
|
|
rose = FloweringPlant("rose", 26, "red")
|
|
sunflower = PrizeFlower("sunflower", 51, "yellow", 10)
|
|
manager = GardenManager()
|
|
|
|
rose.bloom()
|
|
manager.create_garden_network("Alice")
|
|
manager.add_plant("Alice", oak)
|
|
manager.add_plant("Alice", rose)
|
|
manager.add_plant("Alice", sunflower)
|
|
manager.add_plant("Bob", oak)
|
|
manager.grow_all("Alice")
|
|
manager.grow_all("Alice")
|
|
print("\n\nGardenReport")
|
|
manager.GardenStats.garden_report(manager.get_garden("Alice"))
|