میخواهیم کلاسی در زبان پایتون طراحی کنیم که عملکرد یک پروکسی را برای اشیائی که نمایندهٔ آنان است داشته باشد. دقت کنید که این کلاس باید قادر باشد تمامی توابعی را که روی شی اصلی فراخوانی میشود، بدون تغییر کارکرد روی آنان اجرا کند. توجه کنید که این شئ میتواند از هر نوع کلاسی باشد.
نمونه
برای مثال اگر کد زیر را برای کلاس 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 را تکمیل و سپس این فایل را ارسال کنید.
ارسال پاسخ برای این سؤال