LINUX.ORG.RU

Программирование метаклассов в Python


0

0

Большинство читателей уже знакомо с концепциями объектно-ориентированного программирования: наследованием, инкапсуляцией, полиморфизмом. Однако обычно при этом подразумевается создание объектов заданного класса с определенными родителями. С другой стороны, выясняется, что ряд новых программных конструкций оказывается легче или вообще возможно создавать, только если мы можем настраивать сам процесс создания объектов. Метаклассы открывают возможность определенных типов "аспект-ориентированного программирования", например, вы можете расширять классы новыми возможностями трассировки, сохранения объектов, протоколирования ошибок и т.д.

>>> Подробности

★★★

Проверено: maxcom ()

Ответ на: комментарий от demmsnt

> Отступы это гениально - теперь чужой код можно читать и читать легко.

А распечатку на нескольких листах как читать? С линейкой в руках? А если листинг на развороте книги?

> И насколько красивее с отступами:

Отступы очень облегчают чтение программ, но отступы может расставлять автор; делать их свойством языка необязательно. Различные стили отступов -- это вопрос только самодисциплины автора.

VladimirP ★★★★
()
Ответ на: комментарий от AsphyX

>Детский пример: есть объект "осёл" и объект "петух". Первый имеет метод "бежать", второй -- "лететь". И оба -- метод "кричать". И я не хочу задумываться о происхождении этих объектов и наличии общего предка. Я хочу только вызвать метод "кричать", а поскольку оба объекта оный имеют, то _в данном контексте_ они совместимы.

На PHP5 такое через __call() делается :)

KRoN73 ★★★★★
()
Ответ на: комментарий от AsphyX

> А есть какой-нибудь язык, где классов как абстрактного типа не было бы вовсе

Smalltalk вам в помощь. :) Классы там есть, но сама суть ООП там гораздо круче того, что наворотил ТрупСтрауса: наследование там - чисто побочное удобство, а суть всего языка - это объекты + сообщения. Это намного гибче Сипипи и его костылей.

anonymous
()
Ответ на: комментарий от VladimirP

>А распечатку на нескольких листах как читать? С линейкой в руках? А если листинг на развороте книги?

А фигурные скобки на нескольких листах как читать? С калькулятором в руках? :D

...

Если у тебя одна функция попадает на разные листы - то уже рефакторинг нужен. Thinking Forth!

KRoN73 ★★★★★
()
Ответ на: комментарий от alt0v14

> Метаклассы - это очень глубокая материя

Скорее, это прекрасный способ запутать систему. Язык должен быть тупой и понятный, типа Оберона - программы на таком языке можно сопровождать десятилетиями. А помойку вроде ядра линукса невозможно понять уже через 5 лет исправлений.

anonymous
()
Ответ на: комментарий от KRoN73

> А фигурные скобки на нескольких листах как читать? С калькулятором в руках? :D

Смешно. :)

Синтаксис делают всё же не для печати в книгах, а для удобного понимания прогером и компом. Отсюда проистекают такие удобства, как "схлопывания" (folds), рефакторинг (например, "вынести в отдельный метод"), подсветка блока, переформатирование при вставке - даже при полной потере форматирования, "скобочный" код можно легко вставить в любой контекст и он правильно "отступится" (причём даже при наличии "непарных" скобок). А вот что делать с питоновым мусором, если ВДРУГ все пробелы исчезнут - я даж не знаю... Распечатать на рулончиках? :)

Кроме того, скобки удобны компилеру - ему не надо считать пробелы, он шустро ищет парную скобку и всё. Ну и сам человек более свободен в написании. Скажем, тут:

int sum(int a, int b, int c) { return a+b+c; }

Мне НАФИК не упёрлись все эти отступы - функция настолько второстепенна и очевидна, что её запись спокойно уживётся на одной строке.

anonymous
()
Ответ на: комментарий от anonymous

> int sum(int a, int b, int c) { return a+b+c; }

> Мне НАФИК не упёрлись все эти отступы

def sum(a, b, c): return a+b+c

Ы?

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

>Кроме того, скобки удобны компилеру - ему не надо считать пробелы, он шустро ищет парную скобку и всё.

Видны глубокие познания в области синтаксического анализа...

elio
()
Ответ на: комментарий от anonymous

> Синтаксис делают всё же не для печати в книгах, а для удобного понимания прогером и компом.

Давно замечено, что при наличии в сложном коди и отступов, и фигурных скобок, человек ориентируется по отступам. А компилятор по скобкам. Отсюда сплошная фрустрация и глупые баги.

> Отсюда проистекают такие удобства, как "схлопывания" (folds), рефакторинг (например, "вынести в отдельный метод"), подсветка блока, переформатирование при вставке - даже при полной потере форматирования, "скобочный" код можно легко вставить в любой контекст и он правильно "отступится" (причём даже при наличии "непарных" скобок).

Выкинь нотапед и осиль нормальные редакторы.

> А вот что делать с питоновым мусором, если ВДРУГ все пробелы исчезнут - я даж не знаю...

А что делать с сишным мусором, если ВДРУГ все скобки исчезнут? Вешаться.

> Кроме того, скобки удобны компилеру - ему не надо считать пробелы, он шустро ищет парную скобку и всё.

В Питоне отступы разруливают лексический анализатор. При изменении уровня отступа он вставляет токены, аналогичные фигурным скобкам. Компилятора это вообще не касается.

> Ну и сам человек более свободен в написании

...криво оформленного кода. И поэтому приходится вводить разные coding conventions и пинками заставлять людей их соблюдать. Питон гарантирует, что весь код написан в одном стиле => это хорошо. Хотя можно было бы пойти дальше, и весь PEP-8 изначально заложить в синтаксис.

> Скажем, тут: int sum(int a, int b, int c) { return a+b+c; }

def sum(a, b, c): return a + b + c

> Мне НАФИК не упёрлись все эти отступы

Мировому сообществу НАФИК не упёрся ТЫ

Продолжай троллить ещё, а то у меня что-то день сегодня скучный.

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

Помоему тот, кто наезжает на отступы просто ничего по елу не может сказать.

Отступы автоматом делает редактор, никаких вообще действий кроме 1-го TAB делать не надо (в случае со скобками уже 2 скобки).

Ясно, что один стиль лучше каши. Нет обязательно ктонибудь упрется как баран. Скобки легче посчитать ему. Где легче? в каше из 1500 строк?

demmsnt
()
Ответ на: комментарий от anonymous

> int sum(int a, int b, int c) { return a+b+c; }

> Мне НАФИК не упёрлись все эти отступы - функция настолько второстепенна и очевидна...

... что попросту нахрен не нужна :)

anonymous
()
Ответ на: комментарий от anonymous

>Синтаксис делают всё же не для печати в книгах

Ну а нафиг тогда было писать про несколько страниц?

>Отсюда проистекают такие удобства, как "схлопывания" (folds)

Прекрасно работает и для Питона.

>рефакторинг (например, "вынести в отдельный метод")

Которые явно назрел, если у тебя метод не умещается на экран.

>А вот что делать с питоновым мусором, если ВДРУГ все пробелы исчезнут

Если у тебя ВДРУГ все пробелы исчезнут - нужно переставать принимать эти вещества. Если ВДРУГ исчезнут все пробелы, то накроется любая программа на любом языке.

>Кроме того, скобки удобны компилеру

Так бы сразу и сказал, что ты живёшь в 70-х гг. прошлого века

KRoN73 ★★★★★
()
Ответ на: комментарий от demmsnt

>Помоему тот, кто наезжает на отступы просто ничего по елу не может сказать.

Естественно. Ибо структурные программы начали писать с отступами задолго до того, как родился Питон :D Просто в нём реализовали на уровне языка общие рекомендации полувековой давности.

KRoN73 ★★★★★
()
Ответ на: комментарий от AsphyX

> Детский пример: есть объект "осёл" и объект "петух". Первый имеет метод "бежать", второй -- "лететь". И оба -- метод "кричать". И я не хочу задумываться о происхождении этих объектов и наличии общего предка. Я хочу только вызвать метод "кричать", а поскольку оба объекта оный имеют, то _в данном контексте_ они совместимы.

Ruby ducktyping

anonymous
()
Ответ на: комментарий от VladimirP

> Чем дальше, тем всё больше убеждаюсь в том, что Python -- чудесный язык, один из лучших. Вот бы ему добавить форматирование операторными скобками вместо отступов, поддержку регулярных выражений на уровне синтаксиса (как в Perl) и значок перед именами переменных ("$" и т.п., как в shell) -- и всё, получим настолько идеальный язык, что даже не будет нужен Perl.

Ruby way

anonymous
()
Ответ на: комментарий от VladimirP

> А распечатку на нескольких листах как читать? С линейкой в руках? А если листинг на развороте книги?

Во-первых, многостраничный код на бумаге - это бред.

Во-вторых, важно помнить, что блоки в пае отмечаются не только отступами, но и двоеточиями.

yk4ever
()
Ответ на: комментарий от ero-sennin

>Кто сможет мне человеческим языком объяснить, что такое аспектно-ориентированное программирование

Уточнение поведения класса, выраженное отдельным блоком кода. Программирование поведением уточнений.

anonymous
()
Ответ на: комментарий от AsphyX

Смоллток, Оbjective C, Лого, Ruby.

В Смоллтоке и есть все классы определены в глобальном словаре, в другом -- методы классов. Сам тип "класс" также является классом -- метаклассом.

anonymous
()
Ответ на: комментарий от alt0v14

> Метаклассы - это очень глубокая материя, о которой 99% пользователей даже не нужно задумываться. Если вы не понимаете, зачем они вам нужны – значит, они вам не нужны (люди, которым они на самом деле требуются, точно знают, что они им нужны, и им не нужно объяснять - почему). - Тим Питерс (Tim Peters), гуру по Python

Чего там глубокого, вон в Смоллтоке это очень просто. У тебя все -- объект, тип объекта -- класс, тип класса -- метакласс. Обращаясь к методам метакласса ты можешь создавать новые классы или переопределять поведение старых. Метакласс задаёт стандартизированный интерфейс типа "класс".

anonymous
()
Ответ на: комментарий от anonymous

* отдельным универсальным блоком кода.

anonymous
()
Ответ на: комментарий от anonymous

+ класс вызывает методы, отвечая на сообщения. Имеет стандартное сообщение doesNotUnderstand, которое вызывается если метод не найден. Перехватывая это сообщение можно определить прокси-классы и реализовать 1) распределенные вычисления, вызов удалённых методов 2) переопределить методы базового класса для конкретного экземпляра объекта 3)компоненты, аггрегация 4) аспекты ( при вызове методов класса вызывается обёртка-код прокси-класса, из которой вызываются методы класса)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.