Files
42-Piscine_Python/01/ex6/ft_garden_analytics.py

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"))