پروکسی


می‌خواهیم کلاسی در زبان پایتون طراحی کنیم که عملکرد یک پروکسی را برای اشیائی که نماینده‌ٔ آنان‌ است داشته باشد. دقت کنید که این کلاس باید قادر باشد تمامی توابعی را که روی شی اصلی فراخوانی می‌شود، بدون تغییر کارکرد روی آنان اجرا کند. توجه کنید که این شئ می‌تواند از هر نوع کلاسی باشد.

نمونه🔗

برای مثال اگر کد زیر را برای کلاس Radio داشته باشیم:

extensionFromNameproxy.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
Python

سپس اگر یک پروکسی از شئ از کلاس Radio بسازیم

extensionFromNameproxy.py
radio = Radio()
radio_proxy = Proxy(radio)
Python

تمامی توابع بالا باید بر روی radio_proxy قابل فراخوانی باشد:

extensionFromNameproxy.py
radio_proxy.channel = 95
radio_proxy.power()
Python
extensionFromNameterminal
>>> radio.channel
95
Python

اگر تابع فراخوانی‌شده، جزو توابع تعریف‌شده برای شئ هدف نباشد، باید استثنایی با پیام No Such Method پرتاب شود.

همچنین کلاس ‍‍Proxy که باید توابع آن را پیاده‌سازی کنید، باید قادر باشد اطلاعاتی را نیز ذخیره‌سازی کند. توابع و ویژگی‌هایی که این کلاس باید دارا باشد به شرح زیر است.

extensionFromNameproxy.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
Python
تابع ‍‍last_invoked_method

نام آخرین متد معتبر فراخوانی شده بر روی شئ هدف را بازمی‌گرداند و نوع خروجی آن باید رشته باشد. در صورتی که تا لحظهٔ فراخوانی این تابع،‌ متدی روی شئ فراخوانی نشده بود، استثنایی با پیام No Method Is Invoked پرتاب می‌شود.

تابع ‍‍count_of_calls

می‌بایست به ازای نام متد ورودی، تعداد دفعاتی که این متد بر روی شئ فراخوانی شده را بازگرداند. اگر متد ورودی معتبر نباشد، مقدار 0 را برمی‌گرداند.

تابع ‍‍was_called

به ازای نام متد معتبر ورودیَ، یک Boolean را به عنوان خروجی برمی‌گرداند که اگر آن متد برروی شئ فراخوانی شده باشد مقدار True و در غیر این صورت مقدار Falseرا برمی‌گرداند. اگر متد ورودی معتبر نباشد مقدار False را برمی‌گرداند.

در نهایت توجه کنید که در صورتی که ویژگی‌ها و متدهایی به شئ هدف، پس از ساختن پروکسی اضافه شوند، شئ پروکسی باید قادر به مدیریت توابع و ویژگی‌های جدید نیز باشد.

نکات🔗

  • می‌توانید فایل اولیه این سوال را از این لینک دریافت کنید.
  • توابع شما نباید مقداری را چاپ کنند، بلکه باید مقادیر مورد نظر را بازگردانند.

نحوه ارسال🔗

شما باید کلاس Proxy موجود در فایل proxy.py را تکمیل و سپس این فایل را ارسال کنید.