Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2012 17:11:35

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Цепочка конструкторов

Извращение? или таки имеет право быть?

from StringIO import StringIO
from unittest import TestCase
class MetaChained(type):
    _instances = {}
    def __new__(cls, name, bases, dct):
        new_cls = super(MetaChained, cls).__new__(cls, name, bases, dct)
        cls._instances[name] = new_cls
        return new_cls
class Chained(object):
    __metaclass__ = MetaChained
    value = 'Chained'
    def __init__(self):
        self._chained = None
    def _add_in_chain(self, next):
        if self._chained:
            self._chained._add_in_chain(next)
        else:
            self._chained = next
    def __call__(self, out):
        out.write(self.value)
        if self._chained:
            self._chained(out)
    def __getattribute__(self, item):
        try:
            return super(Chained, self).__getattribute__(item)
        except AttributeError, e:
            dct = self.__metaclass__._instances
            if item in dct:
                def constructor(*args, **kwargs):
                    obj = dct[item](*args, **kwargs)
                    self._add_in_chain(obj)
                    return self
                return constructor
            else:
                raise e
class chainedA(Chained):
    value = 'A'
class chainedB(Chained):
    value = 'B'
class chainedC(Chained):
    value = 'C'
class TestChained(TestCase):
    def test_chained(self):
        out = StringIO()
        chain = chainedA().chainedB().chainedC()
        chain(out)
        self.assertEqual('ABC', out.getvalue())



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#2 Сен. 24, 2012 17:35:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Цепочка конструкторов

Странная штука. Применить visitor к цепочке объектов можно и более простыми способами.



Офлайн

#3 Сен. 24, 2012 17:48:57

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Цепочка конструкторов

Андрей Светлов
Странная штука. Применить visitor к цепочке объектов можно и более простыми способами.
Собственно всю бодягу разводил ради вот такого синтаксиса построения цепочки.
chain = chainedA().chainedB().chainedC()
Хотел использовать в своем dsl, а так выглядит нагляднее чем
chain = chainedA(chainedB(chainedC()))
но что-то сомневаюсь, уж больно наворочено получилось.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Сен. 24, 2012 20:01:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Цепочка конструкторов

Chain(A(), B(), C())(out)

Это в Лиспе всё — списки. Для Питона такое не обязательно.



Офлайн

#5 Сен. 25, 2012 05:42:52

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Цепочка конструкторов

Мда, уж. На каждого мудреца довольно простаты :) По идеи это

Андрей Светлов
Chain(A(), B(), C())(out)
первое, что должно прийти в голову, но почему-то не пришло :(
А изврат в кунсткамеру, на третью полку.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version