راه
۴ کیو· سختپیشرفتهPYTHON۴ ثانیه · ۲۵۶ مگابایت

قَطار یا قاطِر؟

در این تمرین می‌خواهیم پروژه‌ای را برای یک سازمان راه‌آهن فرضی پیاده‌سازی کنیم تا مسافران بتوانند با استفاده از آن، مسافرت کرده و بین شهرها جابه‌جا شوند.

کلاس 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__ را به‌گونه‌ای بازنویسی کنید که هنگام print کردن یک شیء مسافر، به جای آدرس حافظه، نام مسافر چاپ شود.


✅ پاسخ نهایی

python
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

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود