پروکسی


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

فایل‌ اولیه پروژه را از اینجا دریافت کنید.

برای مثال اگر کد زیر را برای کلاس 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
Python

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

radio = Radio()
radio_proxy = Proxy(radio)
Python

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

radio_proxy.channel = 95
radio_proxy.power()
Python
>>> radio.channel
>95
Plain text

اگر تابع فراخوانی‌شده، جزو توابع تعریف‌شده برای شئ هدف نباشد، باید استثنایی با پیام 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
Python

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

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

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

پاسخ ارسالی شما، باید یک فایل زیپ با ساختار زیر باشد:

<Your-zip-file-name.zip>
         └── Proxy.py
Plain text
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.