میخواهیم کلاسی در زبان پایتون طراحی کنیم که عملکرد یک پروکسی را برای اشیائی که نمایندهٔ آنان است داشته باشد. دقت کنید که این کلاس باید قادر باشد تمامی توابعی را که روی شی اصلی فراخوانی میشود، بدون تغییر کارکرد روی آنان اجرا کند. توجه کنید که این شئ میتواند از هر نوع کلاسی باشد.
## نمونه
برای مثال اگر کد زیر را برای کلاس `Radio` داشته باشیم:
```python proxy.py
class Radio():
def __init__(self):
self._channel = None
self.is_on = False
self.volume = 0
@property
def channel(self):
return self._channel
@channel.setter
def channel(self, value):
self._channel = value
def power(self):
self.is_on = not self.is_on
```
سپس اگر یک پروکسی از شئ از کلاس `Radio` بسازیم
```python proxy.py
radio = Radio()
radio_proxy = Proxy(radio)
```
تمامی توابع بالا باید بر روی `radio_proxy` قابل فراخوانی باشد:
```python proxy.py
radio_proxy.channel = 95
radio_proxy.power()
```
```python terminal terminal
>>> radio.channel
95
```
اگر تابع فراخوانیشده، جزو توابع تعریفشده برای شئ هدف نباشد، باید استثنایی با پیام `No Such Method` پرتاب شود.
همچنین کلاس `Proxy` که باید توابع آن را پیادهسازی کنید، باید قادر باشد اطلاعاتی را نیز ذخیرهسازی کند. توابع و ویژگیهایی که این کلاس باید دارا باشد به شرح زیر است.
```python proxy.py
class Proxy:
def __init__(self, obj):
self._obj = obj
def last_invoked_method(self):
pass
def count_of_calls(self, method_name):
pass
def was_called(self, method_name):
pass
```
<details class="green">
<summary> **تابع** `last_invoked_method` </summary>
نام آخرین متد معتبر فراخوانی شده بر روی شئ هدف را بازمیگرداند و نوع خروجی آن باید رشته باشد. در صورتی که تا لحظهٔ فراخوانی این تابع، متدی روی شئ فراخوانی نشده بود، استثنایی با پیام `No Method Is Invoked` پرتاب میشود.
</details>
<details class="green">
<summary> **تابع** `count_of_calls` </summary>
میبایست به ازای نام متد ورودی، تعداد دفعاتی که این متد بر روی شئ فراخوانی شده را بازگرداند. اگر متد ورودی معتبر نباشد، مقدار `0` را برمیگرداند.
</details>
<details class="green">
<summary> **تابع** `was_called` </summary>
به ازای نام متد معتبر ورودیَ، یک `Boolean` را به عنوان خروجی برمیگرداند که اگر آن متد برروی شئ فراخوانی شده باشد مقدار `True` و در غیر این صورت مقدار `False`را برمیگرداند. اگر متد ورودی معتبر نباشد مقدار `False` را برمیگرداند.
</details>
**در نهایت توجه کنید که در صورتی که ویژگیها و متدهایی به شئ هدف، پس از ساختن پروکسی اضافه شوند، شئ پروکسی باید قادر به مدیریت توابع و ویژگیهای جدید نیز باشد.**
## نکات
+ میتوانید فایل اولیه این سوال را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/21208/) دریافت کنید.
+ توابع شما نباید مقداری را چاپ کنند، بلکه باید مقادیر مورد نظر را بازگردانند.
## نحوه ارسال
شما باید کلاس `Proxy` موجود در فایل `proxy.py` را تکمیل و سپس این فایل را ارسال کنید.