*عَلی* که با کمک شما توانست از مخمصهی خرید ۳ پیتزا نجات پیدا کند؛ حال میخواهد بهعنوان تشکر، پیتزایی برای شما بفرستد. ولی از آنجایی که شما در شهر دیگری زندگی میکنید، دو راه برای فرستادن پیتزا به شما پیشنهاد میکند:
1. ارسال پیتزا با قَطار
2. ارسال پیتزا با قاطِر
از آنجایی که شما برای حل کردن این سوال و رفتن به سوال بعدی، عجلهی بسیاری دارید؛ گزینهی اول را انتخاب میکنید. ولی امان از دل غافل! شما باید دو کلاس خواسته شده را پیادهسازی کنید تا شرکت راهآهن، این پیتزا را برای شما بفرستد.
کلاس `Train` از پیش پیادهسازی شده است ولی دو کلاس `Trip` و `Passenger` را شما باید پیادهسازی کنید.
<details class="red">
<summary> **کلاس قطار** `Train` </summary>
### متد سازنده `__init__`
**این متد در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید.** ویژگیهایی که در این متد به شیء اختصاص داده میشوند، عبارتاند از:
+ **آخرین شهر بازدید شده `last_visited_city`** : از نوع str میباشد.
+ **ظرفیت بار `weight_capacity`**: از نوع float میباشد.
+ **وضعیت `is_on_trip`**: از نوع bool است؛ در صورتی که True باشد، قطار در حال سفر است و اگر False باشد یعنی در ایستگاه راه آهن مستقر است.
</details>
<details class="blue">
<summary> **کلاس سفر** `Trip` </summary>
### ویژگیهای کلاس (Class Attributes)
+ **ویژگی ```all_cities```:** این ویژگی برابر با یک تاپل از همه شهرهایی است که امکان ساخت راه آهن در آنها وجود دارد. **این ویژگی در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید.**
### متد سازنده `__init__`
**این متد در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید.** ویژگیهایی که در این متد به شیء اختصاص داده میشوند، عبارتاند از:
+ **قطار `train`**: از نوع Train میباشد.
+ **شهر مبدا `origin_city`**: از نوع str میباشد.
+ **شهر مقصد `destination_city`**: از نوع str میباشد.
+ **مسافران `passengers`** : از نوع list میباشد.
### جزئیات
<details class="grey">
<summary> **متد** `origin_city_validation` </summary>
این متد یک ورودی به نام origin_city میگیرد:
+ اگر این ورودی در لیست `all_cities` موجود نباشد، یک Exception با پیغام `This input is not a verified city!` پرتاب میکند.
+ اگر این ورودی با شهر مقصد برابر باشد، یک Exception با پیغام `Origin and destination cities can't be the same!` پرتاب میکند.
+ اگر این ورودی با آخرین شهر بازدید شده قطار برابر نباشد، یک Exception با پیغام `The train of the trip is not available in the origin city!` پرتاب میکند.
در نهایت اگر هیچکدام از حالتهای فوق صادق نبود باید origin_city برگردانده شود.
</details>
<details class="grey">
<summary> **متد** `train_validation` </summary>
این متد یک ورودی به نام train میگیرد:
+ اگر این ورودی از جنس قطار (کلاس `Train`) نباشد، یک Exception با پیغام `This input is not a train!` پرتاب میکند.
+ در صورتی که قطار در حال سفر باشد، یک Exception با پیغام `This train is not available!` پرتاب میکند.
در نهایت اگر هیچکدام از حالتهای فوق صادق نبود باید train برگردانده شود.
</details>
<details class="grey">
<summary> **متد جادویی**</summary>
داندرمتدی را برای این کلاس بازنویسی کنید که هنگام صدا زدن شیء سفر، **«ظرفیتِ وزنِ بارِ باقیمانده از قطارِ سفر»** برگردانده شود.
مثلا اگر یک سفر قطاری با ظرفیت وزن 1000 کیلوگرم و دو مسافر با وزن بار 60 و 70 کیلوگرم داشته باشد، هنگام صدا زدن این سفر، عدد 870 برگردانده میشود.
</details>
</details>
</details>
<details class="blue">
<summary> **کلاس مسافر** `Passenger` </summary>
### متد سازنده `__init__`
**این متد در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید.** ویژگیهایی که در این متد به شیء اختصاص داده میشوند، عبارتاند از:
+ **نام `fullname`**: از نوع str میباشد.
+ **وزن بار `load_weight`**: از نوع float میباشد.
### جزئیات
<details class="grey">
<summary> **متد** `attend_trip` </summary>
این متد در ورودی یک سفر میگیرد و در صورتی که بار مسافر از **«ظرفیتِ وزنِ بارِ باقیمانده از قطارِ سفر»** کمتر یا مساوی باشد، مسافر را به لیست مسافران سفر اضافه میکند. در غیر این صورت یک Exception با پیغام `Heavy load!` پرتاب میکند.
</details>
<details class="grey">
<summary> **متد** `cancel_trip` </summary>
این متد در ورودی یک سفر میگیرد و در صورتی که مسافر در لیست مسافران آن سفر موجود باشد، مسافر را از لیست مسافران سفر حذف میکند. در غیر این صورت یک Exception با پیغام `This passenger is not attended to this trip!` پرتاب میکند.
</details>
<details class="grey">
<summary> **متد جادویی**</summary>
داندرمتدی را برای این کلاس بازنویسی کنید که اگر یک شیء مسافر `print` شود، به جای آدرس آن شیء در حافظه، نام مسافر چاپ شود.
</details>
</details>
## نکات
+ میتوانید فایل اولیه این سوال را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/102252/) دریافت کنید.
+ شما میتوانید با پیادهسازی این سوال به صورت بخشبخش نمره بگیرید.
+ در صورت تمایل، میتوانید علاوهبر کلاسهای خواستهشده، کلاسها و تابعهای کمکی دیگری نیز در فایل `railway.py` پیادهسازی کنید.
## نحوه ارسال
شما باید کلاسهای `Train`، `Passenger` و `Trip` موجود در فایل `railway.py` را تکمیل و سپس این فایل را ارسال کنید.