Обновить

Комментарии 33

Скажите, а как/где сделали такой красивый скриншот?
Это gEdit, стандартная тема Cobalt, стандартная подстветка для Питона + шрифт Consolas от Микрософта. Дальше просто вырезал нужный фрагмент да сделал тень.
НЛО прилетело и опубликовало эту надпись здесь
тоже только из-за него зашел )))
Это для меня открытие года, сколько не кодил на питоне — такое впервые увидел.
НЛО прилетело и опубликовало эту надпись здесь
Боже, Python такой клёвый! Пожалуйста, сделай так чтобы он был еще очень быстрым!
Слышал, но пока не пробовал.
Меня code.google.com/p/unladen-swallow/ вдохновляет
да. но он пока еще только начинает развиваться… еще можно на PyPy посмотреть. они вроде как раз в процессе прикручивания JIT-компилятора
Вот за такое и люблю Питон — при желании можно сделать удобные и красивые вещи под конкретные задачи.
Не разделяю общих восторгов, хоть и являюсь фанатом python. Это скорее «не документированная» возможность, чем какая-то реальная вещь. А то что python милашка это и так ясно :D
Что значит не документированные? Есть документированный инструмент, а насколько ты умеешь им владеть зависит от тебя.
«не документированная» != не документированная
Открываем исходники Django и не порем чушь.
автор поста не представил ни одного прикладного примера, примеры в статье носят сугубо академический характер. И на джангу ссылок тоже не было.
И что? Это отменяет активное использование метаклассов в python?
Конечно питон-гуру могут меня поправить, но я считал метаклассами классы, создающие классы. Когда я говорил про «не документированную возможность» я говорил про использование именованых аргументов при создании класса(сабж статьи что тут сверху страницы). Так что научитесь читать и не порите чушь.
Ах, да я уже прочитал ваш коммент внизу, я вас раскусил, вы не читали статью, чукча-писатель решил похвастаться тем что открывал исходники джанги.
Да, вы правы.
вот именно за такие извращения я и люблю python )
но что-то я не могу представить где это может понадобится. примеры неубедительны совсем…
Я тоже сначала статью закончил словами, что в реальности это практически нигде не пригодится. Только как-то мрачно получалось, поэтому убрал. Думаю, что стоит расценивать только как демонстрацию гибкости Питона.
class Artist(MyRe, '/artist/\d+'): pass

Предлагаю заменить на что-то вроде makeRe('Artist', '/artist/\d+'), которое будет возвращать класс.
Или недостаточно красиво?
тогда вложенные классы (как в примере) не получится так красиво сделать
А так?

class Music(MyRe):
pattern = '/music'

Artist = '/artist/\d+'
Song = '/song/\d+'
Album = '/album\d+'

Правда, в данном случае мета-классу MyRe нужно будет озадачиться конвертацией аттрибутов.
Может быть, со мной что-то не так, но мне такой вариант действительно кажется более симпатичным, чем «class Artist(MyRe, '/artist/\d+'): pass».
я с вами в чем-то согласен. не то что симпатичнее, скорее привычней :)

я потому и спросил у автора применение :) примеры не маштабируются: если таких атрибутов как pattern не 1, а 3-4, то передавать их в качестве базовых классов уж совсем некрасиво выходит…
А наследование?
Поясняю.
Мне кажется, что запись «makeRe('Artist', '/artist/\d+')», возвращающая новый полноценный класс, менее магична, более проста и понятна, чем «class Artist(MyRe, '/artist/\d+'): pass».
Не вижу никаких проблем для наследования, либо не понимаю вашего вопроса.
Конечно, это менее магично. Но наследования все равно не получится:
class Artist(MyClass, '/artist/\d+'):
    pass

class RockArtist(Artist):
    pass
почему же?

Artist = makeRe('Artist', '/artist/\d+')

class RockArtist(Artist): pass
Или даже так:
Artist = makeRe('/artist/\d+')
class RockArtist(Artist): pass

Только зачем? О.о
мне когда-то самому нужно было что-то похожее. в итоге я воспользовался namedtuple :)
Автору спасибо за статью, жаль примеры у вас слабые, да и изначальный посыл не вдохновляет: )
А вот за ссылочки в конце статьи благодарен особенно. Всем, кто решил, что метаклассы это недокументированная магия, советую пройти по этим ссылкам.
А также традиционный совет — открываем django/db/models/base.py и смотрим на первый же класс, который на самом деле метакласс.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации