میخواهیم کلاسی در زبان پایتون طراحی کنیم که عملکرد یک پروکسی را برای اشیائی که نمایندهٔ آنان است داشته باشد. دقت کنید که این کلاس باید قادر باشد تمامی توابعی را که روی شی اصلی فراخوانی میشود، بدون تغییر کارکرد روی آنان اجرا کند. توجه کنید که این شئ میتواند از هر نوع کلاسی باشد.
فایل اولیه پروژه را از [اینجا](http://s8.picofile.com/file/8339068900/prox_initial.zip.html) دریافت کنید.
برای مثال اگر کد زیر را برای کلاس `Radio` داشته باشیم:
```python
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
radio = Radio()
radio_proxy = Proxy(radio)
```
تمامی توابع بالا باید بر روی `radio_proxy` قابل فراخوانی باشد:
```python
radio_proxy.channel = 95
radio_proxy.power()
```
```
>>> radio.channel
>95
```
اگر تابع فراخوانیشده، جزو توابع تعریفشده برای شئ هدف نباشد، باید استثنایی با پیام `No Such Method` پرتاب شود.
همچنین کلاس `Proxy` که باید توابع آن را پیادهسازی کنید، باید قادر باشد اطلاعاتی را نیز ذخیرهسازی کند. توابع و ویژگیهایی که این کلاس باید دارا باشد به شرح زیر است: (این فایل اولیه را می توانید از اینجا دریافت کنید.)
```python
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
```
که در آن تابع `last_invoked_method` نام آخرین متد معتبر فراخوانی شده بر روی شئ هدف را بازمیگرداند و تایپ خروجی آن باید رشته باشد. در صورتی که تا لحظهٔ فراخوانی این تابع، متدی روی شئ فراخوانی نشده بود، استثنایی با پیام `No Method Is Invoked` پرتاب میشود.
تابع `count_of_calls` میبایست به ازای نام متد ورودی، تعداد دفعاتی که این متد بر روی شئ فراخوانی شده را بازگرداند. اگر متد ورودی معتبر نباشد، مقدار `0` را برمیگرداند.
تابع `was_called` به ازای نام متد معتبر ورودیَ، یک `Boolean` را به عنوان خروجی برمیگرداند که اگر آن متد برروی شئ فراخوانی شده باشد مقدار `True` و در غیر این صورت مقدار `False`را برمیگرداند. اگر متد ورودی معتبر نباشد مقدار `False` را برمیگرداند.
در نهایت توجه کنید که در صورتی که ویژگیها و متدهایی به شئ هدف، پس از ساختن پروکسی اضافه شوند، شئ پروکسی باید قادر به مدیریت توابع و ویژگیهای جدید نیز باشد.
پاسخ ارسالی شما، باید یک فایل زیپ با ساختار زیر باشد:
```
<Your-zip-file-name.zip>
└── Proxy.py
```