میخواهیم کلاسی در زبان پایتون طراحی کنیم که عملکرد یک پروکسی را برای اشیائی که نمایندهٔ آنان است داشته باشد. دقت کنید که این کلاس باید قادر باشد تمامی توابعی را که روی شی اصلی فراخوانی میشود، بدون تغییر کارکرد روی آنان اجرا کند. توجه کنید که این شئ میتواند از هر نوع کلاسی باشد.
نمونه
برای مثال اگر کد زیر را برای کلاس Radio
داشته باشیم:
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
بسازیم
radio = Radio()
radio_proxy = Proxy(radio)
تمامی توابع بالا باید بر روی radio_proxy
قابل فراخوانی باشد:
radio_proxy.channel = 95
radio_proxy.power()
>>> radio.channel
95
اگر تابع فراخوانیشده، جزو توابع تعریفشده برای شئ هدف نباشد، باید استثنایی با پیام No Such Method
پرتاب شود.
همچنین کلاس Proxy
که باید توابع آن را پیادهسازی کنید، باید قادر باشد اطلاعاتی را نیز ذخیرهسازی کند. توابع و ویژگیهایی که این کلاس باید دارا باشد به شرح زیر است.
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
last_invoked_method
نام آخرین متد معتبر فراخوانی شده بر روی شئ هدف را بازمیگرداند و نوع خروجی آن باید رشته باشد. در صورتی که تا لحظهٔ فراخوانی این تابع، متدی روی شئ فراخوانی نشده بود، استثنایی با پیام No Method Is Invoked
پرتاب میشود.
تابع count_of_calls
count_of_calls
میبایست به ازای نام متد ورودی، تعداد دفعاتی که این متد بر روی شئ فراخوانی شده را بازگرداند. اگر متد ورودی معتبر نباشد، مقدار 0
را برمیگرداند.
تابع was_called
was_called
به ازای نام متد معتبر ورودیَ، یک Boolean
را به عنوان خروجی برمیگرداند که اگر آن متد برروی شئ فراخوانی شده باشد مقدار True
و در غیر این صورت مقدار False
را برمیگرداند. اگر متد ورودی معتبر نباشد مقدار False
را برمیگرداند.
در نهایت توجه کنید که در صورتی که ویژگیها و متدهایی به شئ هدف، پس از ساختن پروکسی اضافه شوند، شئ پروکسی باید قادر به مدیریت توابع و ویژگیهای جدید نیز باشد.
نکات
- میتوانید فایل اولیه این سوال را از این لینک دریافت کنید.
- توابع شما نباید مقداری را چاپ کنند، بلکه باید مقادیر مورد نظر را بازگردانند.
نحوه ارسال
شما باید کلاس Proxy
موجود در فایل proxy.py
را تکمیل و سپس این فایل را ارسال کنید.
ارسال پاسخ برای این سؤال