Python дескриптор протокол аналог на други езици?

Има ли нещо подобно на протокола за дескриптор на Python, внедрен на други езици? Изглежда като хубав начин за увеличаване на модулността/капсулирането, без да раздувате реализацията на вашия съдържащ клас, но никога не съм чувал за подобно нещо на други езици. Вероятно отсъства ли в други езици поради излишните разходи за търсене?


person cdleary    schedule 29.08.2008    source източник


Отговори (2)


И аз не съм чувал за пряк еквивалент. Вероятно бихте могли да постигнете същия ефект с макроси, особено в език като Lisp, който има изключително мощни макроси.

Изобщо не бих се изненадал, ако други езици започнат да включват нещо подобно, защото е толкова мощно.

person Andrew Wilkinson    schedule 29.08.2008

И Ruby, и C# ви позволяват лесно да създавате инструменти за достъп чрез указване на getter/setter методи за даден атрибут, подобно на Python. Това обаче не е предназначено да ви позволи естествено да пишете кода за тези методи в друг клас по начина, който Python позволява. На практика не съм сигурен доколко това има значение, тъй като всеки път, когато съм виждал атрибут, дефиниран чрез дескрипторния протокол, той е бил имплементиран в същия клас.

РЕДАКТИРАНЕ: По дяволите моята дислексия (под което имам предвид невнимателно четене). По някаква причина винаги съм чел "дескриптор" като "декоратор" и обратно, дори когато аз съм този, който въвежда и двете. Ще оставя публикацията си непокътната, тъй като съдържа валидна информация, макар и информация, която няма абсолютно нищо общо с въпроса.

Самият термин "декоратор" всъщност е името на дизайнерски шаблон, описан в известната книга "Design Patterns". Статията в Уикипедия съдържа много примери в различни програмни езици за използване на декоратор: http://en.wikipedia.org/wiki/Decorator_pattern

Въпреки това, декораторите в тази статия са обектно-ориентирани; те имат класове, внедряващи предварително дефиниран интерфейс, който позволява на друг съществуващ клас да се държи по различен начин по някакъв начин и т.н. Декораторите на Python действат по функционален начин, като заменят функция по време на изпълнение с друга функция, което ви позволява ефективно да модифицирате/замените тази функция, да вмъкнете код и т.н.

Това е известно в света на Java като аспектно-ориентирано програмиране и AspectJ Java компилаторът ви позволява да правите такива неща и да компилирате вашия AspectJ код (който е надмножество на Java) в Java байт код.

Не съм достатъчно запознат с C# или Ruby, за да знам каква би била тяхната версия на декораторите.

person Eli Courtwright    schedule 08.09.2008
comment
дескрипторният протокол не е същият като моделът на декоратора в Python -- имам предвид способността да се направи екземпляр на обект в атрибут на друг обект, който е проксиран към динамично. - person cdleary; 29.08.2008