قَطار یا قاطِر؟
در این تمرین میخواهیم پروژهای را برای یک سازمان راهآهن فرضی پیادهسازی کنیم تا مسافران بتوانند با استفاده از آن، مسافرت کرده و بین شهرها جابهجا شوند.
کلاس Train از پیش پیادهسازی شدهاست؛ ولی دو کلاس Trip و Passenger را شما باید پیادهسازی کنید.
🚂 کلاس Train (قطار)
کلاس Train از پیش پیادهسازی شدهاست و نیازی به تغییر آن نیست.
🔹 init(self, last_visited_city, weight_capacity, is_on_trip)
ویژگیها:
last_visited_city: آخرین شهر بازدیدشدهی قطار (نوع:str)weight_capacity: ظرفیت بار قطار (نوع:float)is_on_trip: وضعیت در سفر بودن (نوع:bool)
🗺️ کلاس Trip (سفر)
🔹 ویژگی کلاس (Class Attribute)
all_cities= ("Tehran", "Isfahan", "Shiraz", "Mashhad", "Tabriz")این ویژگی برابر با یک تاپل از همهی شهرهایی است که امکان ساخت راه آهن در آنها وجود دارد. در پروژهی اولیه مقداردهی شدهاست و نیازی نیست آن را تغییر دهید.
🔹 init(self, train, origin_city, destination_city)
ویژگیها:
train: قطار سفر (نوع:Train)origin_city: شهر مبدأ (نوع:str)destination_city: شهر مقصد (نوع:str)passengers: لیست مسافران (نوع:list)این متد در پروژهی اولیه تکمیل شدهاست و نیازی نیست آن را تغییر دهید.
🔹 origin_city_validation(self, origin_city)
این متد یک ورودی به نام
origin_cityدریافت میکند و تعیین میکند که آیا این شهر، یک شهر معتبر برای مبدأ سفر است یا خیر:
- اگر در لیست
all_citiesنباشد → استثنا با پیغام"This input is not a verified city!"- اگر با شهر مقصد برابر باشد → استثنا با پیغام
"Origin and destination cities can't be the same!"- اگر با آخرین شهر بازدیدشدهی قطار برابر نباشد → استثنا با پیغام
"The train of the trip is not available in the origin city!"- در غیر این صورت → بازگرداندن
origin_city
🔹 train_validation(self, train)
این متد یک ورودی به نام
trainمیگیرد و تعیین میکند که آیا این یک قطار معتبر برای سفر است یا خیر:
- اگر از جنس
Trainنباشد → استثنا با پیغام"This input is not a train!"- اگر قطار در حال سفر باشد → استثنا با پیغام
"This train is not available!"- در غیر این صورت → بازگرداندن
train
🔹 call(self)
داندرمتد
__call__را بهگونهای بازنویسی کنید که هنگام صدا زدن شیء سفر بهصورتtrip()، «ظرفیتِ وزنِ بارِ باقیمانده از قطارِ سفر» برگردانده شود.💡 مجموع وزن بار مسافران سفر را جمع کنید و از ظرفیت بار قطار کم کنید.
مثال: اگر قطار ظرفیت
1000کیلوگرم و دو مسافر با وزنهای60و70داشته باشد → خروجی870
🧳 کلاس Passenger (مسافر)
🔹 init(self, fullname, load_weight)
ویژگیها:
fullname: نام مسافر (نوع:str)load_weight: وزن بار مسافر (نوع:float)
🔹 attend_trip(self, trip)
یک شیء سفر (از جنس
Trip) دریافت میکند:
- اگر وزن بار مسافر ≤ ظرفیت باقیماندهی قطار → مسافر را به لیست مسافران سفر اضافه میکند
- در غیر این صورت → استثنا با پیغام
"Heavy load!"
🔹 cancel_trip(self, trip)
یک شیء سفر (از جنس
Trip) دریافت میکند:
- اگر مسافر در لیست مسافران سفر موجود باشد → مسافر را از لیست حذف میکند
- در غیر این صورت → استثنا با پیغام
"This passenger is not attended to this trip!"
🔹 str(self)
داندرمتد
__str__را بهگونهای بازنویسی کنید که هنگام
✅ پاسخ نهایی
class Trip:
all_cities = ("Tehran", "Isfahan", "Shiraz", "Mashhad", "Tabriz")
def __init__(self, train, origin_city, destination_city):
self.train = train
self.origin_city = origin_city
self.destination_city = destination_city
self.passengers = []
def origin_city_validation(self, origin_city):
if origin_city not in Trip.all_cities:
raise ValueError("This input is not a verified city!")
if origin_city == self.destination_city:
raise ValueError("Origin and destination cities can't be the same!")
if origin_city != self.train.last_visited_city:
raise ValueError("The train of the trip is not available in the origin city!")
return origin_city
def train_validation(self, train):
if not isinstance(train, Train):
raise ValueError("This input is not a train!")
if train.is_on_trip:
raise ValueError("This train is not available!")
return train
def __call__(self):
total_load = 0
for passenger in self.passengers:
total_load += passenger.load_weight
return self.train.weight_capacity - total_load
class Passenger:
def __init__(self, fullname, load_weight):
self.fullname = fullname
self.load_weight = load_weight
def attend_trip(self, trip):
if self.load_weight <= trip():
trip.passengers.append(self)
else:
raise ValueError("Heavy load!")
def cancel_trip(self, trip):
if self in trip.passengers:
trip.passengers.remove(self)
else:
raise ValueError("This passenger is not attended to this trip!")
def __str__(self):
return self.fullname
📄 main.py
📖 توضیح کد
- کلاس
Trip: ویژگی کلاسall_citiesشامل لیست شهرهای معتبر متدorigin_city_validationسه شرط اعتبارسنجی را بررسی میکند متدtrain_validationنوع قطار و وضعیت سفر آن را بررسی میکند متد__call__وزن باقیمانده را محاسبه میکند - کلاس
Passenger: متدattend_tripبا بررسی ظرفیت باقیمانده، مسافر را اضافه میکند متدcancel_tripمسافر را از لیست سفر حذف میکند متد__str__نام مسافر را برمیگرداند
در متد
attend_tripازtrip()برای دریافت ظرفیت باقیمانده استفاده شده است (چون__call__این قابلیت را فراهم کرده است).همچنین کلاس
Trainاز پیش پیادهسازی شده است و در این فایل تعریف نشده، اما در اجرای واقعی باید موجود باشد.
🚀 پس از تکمیل کلاسها، میتوانید سیستم را با ایجاد قطار، سفر و مسافران مختلف تست کنید.
نمونهها
trip = Trip(Train("Tehran", 1000, False), "Tehran", "Shiraz")
Passenger("Ali", 60).attend_trip(trip)
Passenger("Sara", 70).attend_trip(trip)
trip()
[str(p) for p in trip.passengers]870 ['Ali', 'Sara']
trip = Trip(Train("Tehran", 100, False), "Tehran", "Shiraz")
for city in ["Qom", "Shiraz", "Mashhad", "Tehran"]:
try:
print(trip.origin_city_validation(city))
except Exception as error:
print(error)This input is not a verified city! Origin and destination cities can't be the same! The train of the trip is not available in the origin city! Tehran
trip = Trip(Train("Tabriz", 100, False), "Tabriz", "Tehran")
for candidate in ["not a train", Train("Tabriz", 10, True), Train("Tabriz", 10, False)]:
try:
print(type(trip.train_validation(candidate)).__name__)
except Exception as error:
print(error)This input is not a train! This train is not available! Train
trip = Trip(Train("Isfahan", 100, False), "Isfahan", "Mashhad")
Passenger("A", 60).attend_trip(trip)
try:
Passenger("B", 50).attend_trip(trip)
except Exception as error:
print(error)
Passenger("C", 40).attend_trip(trip)
trip()Heavy load! 0
trip = Trip(Train("Shiraz", 500, False), "Shiraz", "Tabriz")
p = Passenger("Reza", 120)
p.attend_trip(trip)
trip()
p.cancel_trip(trip)
trip()
try:
p.cancel_trip(trip)
except Exception as error:
print(error)380 500 This passenger is not attended to this trip!
print(Passenger("Reza Ahmadi", 5))Reza Ahmadi
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود