Let's build a simple system that a Kenyan tour company might use to manage safari bookings:
from datetime import datetime
# Base class for all tours
class SafariTour:
def __init__(self, name, duration, price):
self.name = name
self.duration = duration # in days
self.price = price # in KSh
self.booked_dates = []
self.customers = []
def get_info(self):
return f"{self.name}: {self.duration} days for KSh {self.price}"
def book(self, customer, date):
# Check if date is available
if self.is_date_available(date):
self.booked_dates.append(date)
self.customers.append(customer)
return f"Booking confirmed for {customer.name} on {date.strftime('%Y-%m-%d')}"
return f"Sorry, {self.name} is not available on {date.strftime('%Y-%m-%d')}"
def is_date_available(self, date):
# Check if the date is already booked
return date not in self.booked_dates
# Different types of safaris
class WildlifeSafari(SafariTour):
def __init__(self, name, duration, price, animals):
super().__init__(name, duration, price)
self.animals = animals # List of animals likely to be seen
def get_info(self):
return f"{super().get_info()}. Animals you might see: {', '.join(self.animals)}"
class CulturalSafari(SafariTour):
def __init__(self, name, duration, price, tribes):
super().__init__(name, duration, price)
self.tribes = tribes # List of tribes to visit
def get_info(self):
return f"{super().get_info()}. Experience the culture of: {', '.join(self.tribes)}"
def includes_ceremony(self):
return self.duration >= 3 # Cultural ceremonies included for tours 3+ days
# Customer class
class Customer:
def __init__(self, name, email, phone):
self.name = name
self.email = email
self.phone = phone
self.bookings = []
def add_booking(self, tour, date):
self.bookings.append({"tour": tour, "date": date})
def get_booking_summary(self):
if not self.bookings:
return f"{self.name} has no bookings"
summary = f"{self.name}'s bookings:\n"
for index, booking in enumerate(self.bookings, start=1):
summary += f"{index}. {booking['tour'].name} on {booking['date'].strftime('%Y-%m-%d')}\n"
return summary
# Tour company class
class KenyanSafariCompany:
def __init__(self, name):
self.name = name
self.tours = []
self.revenue = 0
def add_tour(self, tour):
self.tours.append(tour)
def book_tour(self, tour_name, customer, date):
tour = next((t for t in self.tours if t.name == tour_name), None)
if not tour:
return f'Tour "{tour_name}" not found'
booking_result = tour.book(customer, date)
if not booking_result.startswith("Sorry"):
# Booking was successful
customer.add_booking(tour, date)
self.revenue += tour.price
return booking_result
def get_total_revenue(self):
return f"Total revenue: KSh {self.revenue}"
def get_available_tours(self):
return "\n".join(tour.get_info() for tour in self.tours)
# Usage example
from datetime import datetime # Ensure datetime is imported
maasai_mara_safari = WildlifeSafari(
"Maasai Mara Adventure",
4,
25000,
["Lions", "Elephants", "Giraffes", "Zebras", "Wildebeest"]
)
samburu_cultural_tour = CulturalSafari(
"Samburu Cultural Experience",
3,
18000,
["Samburu", "Turkana"]
)
nairobi_national_park = WildlifeSafari(
"Nairobi National Park Day Trip",
1,
5000,
["Rhinos", "Lions", "Buffaloes", "Giraffes"]
)
# Create a tour company
kenya_safaris = KenyanSafariCompany("Kenya Safaris Ltd")
kenya_safaris.add_tour(maasai_mara_safari)
kenya_safaris.add_tour(samburu_cultural_tour)
kenya_safaris.add_tour(nairobi_national_park)
# Create customers
john_kamau = Customer("John Kamau", "john@example.com", "0722123456")
mary_ochieng = Customer("Mary Ochieng", "mary@example.com", "0733987654")
# Book tours
print(kenya_safaris.book_tour("Maasai Mara Adventure", john_kamau, datetime(2023, 6, 15)))
print(kenya_safaris.book_tour("Samburu Cultural Experience", mary_ochieng, datetime(2023, 7, 20)))
print(kenya_safaris.book_tour("Nairobi National Park Day Trip", john_kamau, datetime(2023, 5, 10)))
# Check bookings and revenue
print(john_kamau.get_booking_summary())
print(mary_ochieng.get_booking_summary())
print(kenya_safaris.get_total_revenue())