Я решаю питон коаны .У меня нет никаких реальных проблем до 34-го.
это проблема:
Проект: Создать прокси-класс
В этом назначении создайтекласс прокси (один запускается для вас ниже).Вы должны иметь возможность инициализировать прокси-объект с любым объектом.Любые атрибуты, вызываемые для прокси-объекта, должны быть переданы целевому объекту.При отправке каждого вызова атрибута прокси должен записывать имя отправленного атрибута.
Класс прокси для вас запущен.Вам нужно будет добавить обработчик отсутствующего метода и любые другие вспомогательные методы.Спецификация класса Proxy приведена в коане AboutProxyObjectProject.
Примечание. Это немного сложнее, чем аналог Ruby Koans, но вы можете сделать это!
, и этомое решение до сих пор:
class Proxy(object):
def __init__(self, target_object):
self._count = {}
#initialize '_obj' attribute last. Trust me on this!
self._obj = target_object
def __setattr__(self, name, value):pass
def __getattr__(self, attr):
if attr in self._count:
self._count[attr]+=1
else:
self._count[attr]=1
return getattr(self._obj, attr)
def messages(self):
return self._count.keys()
def was_called(self, attr):
if attr in self._count:
return True
else: False
def number_of_times_called(self, attr):
if attr in self._count:
return self._count[attr]
else: return False
До этого теста оно работает:
def test_proxy_records_messages_sent_to_tv(self):
tv = Proxy(Television())
tv.power()
tv.channel = 10
self.assertEqual(['power', 'channel='], tv.messages())
, где tv.messages()
равно ['power']
, потому что tv.channel=10
берется прокси-объектом, а нетелевизионный объект.
Я пытался манипулировать методом __setattr__
, но я всегда заканчиваю бесконечный цикл.
edit 1:
Я пытаюсь это:
def __setattr__(self, name, value):
if hasattr(self, name):
object.__setattr__(self,name,value)
else:
object.__setattr__(self._obj, name, value)
Но тогда я получаю эту ошибку в цикле последней записи:
RuntimeError: maximum recursion depth exceeded while calling a Python object
File "/home/kurojishi/programmi/python_koans/python 2/koans/about_proxy_object_project.py", line 60, in test_proxy_method_returns_wrapped_object
tv = Proxy(Television())
File "/home/kurojishi/programmi/python_koans/python 2/koans/about_proxy_object_project.py", line 25, in __init__
self._count = {}
File "/home/kurojishi/programmi/python_koans/python 2/koans/about_proxy_object_project.py", line 33, in __setattr__
object.__setattr__(self._obj, name, value)
File "/home/kurojishi/programmi/python_koans/python 2/koans/about_proxy_object_project.py", line 36, in __getattr__
if attr in self._count:
Цикл находится в __getattr__
.