Pull to refresh

Comments 34

Спасибо! Хоть до конца магию метапрограммирования еще не постиг, но пост как раз в тему. + вам. Ну и в тематический блог Язык программирования Python перенесите потом, плиз.
И, наконец, при поиске элемента v3 обращаемся к словарю родителю B-A, и достаем его оттуда

v3?
Действительно, описка. Исправил. v3, имелось ввиду v0.
> позволено «на лету» определять классы

в Python'e 3000 доступен также метод __build_class__
С 3.х не разбирался, но я думаю __build_class__, мало чем отличается от type() в 2.х
Что то у меня сомнение вызывает эта фраза — «Классы в питоне есть экземпляры метаклассов». Да и вообще — связка A есть B вышла из употребления в русском языке давным давно. Или автор англоязычный?

В общем статья весьма низкого уровня, уж извините.
А, нет, насчет экземпляров вы правы, но зачем же все таки так не по русски выражаться?
Что то у меня сомнение вызывает эта фраза — «Классы в питоне есть экземпляры метаклассов».


Полностью с вами согласен. Правильно она звучала бы как «Классы в питоне суть экземпляры метаклассов» :)
Интересно… Но пугает весёлость :-) Обычно весёлые программы веселят только автора и только в момент написания, а вот если потом надо это фиксить, развивать, адаптировать под новые реалии… вот тут вся весёлость может пропасть. Я бы четырежды подумал, прежде, чем делать что-то весёлое; вот такой я унылый :-)
На таких веселостях очень классные вещи делаются, к примеру Django.
У Django есть смягчающие обстоятельства.

1. Она документирована и не заставляет вас разбираться с реализацией. Весёлые программы обычно не обладают таким свойством.
2. Там эта технология используется умеренно. Обычно setattr натравливается на self или на что-то ещё внутри объекта. Я не знаю случаев (хотя скорее всего они есть), когда там создаётся новый объект прям с нуля через type+setattr.

Одним словом, мне не кажется, что Django писали сильно веселясь. Напротив, люди много думали и уныло документировали :-)
Я про метаклассы — думаю вы смотрели код форм и моделей.
Показаны какие-то метаклассы. Не понимаю, какое отношение это имеет к метапрограммированию?
Почему:

setattr(B, '__init__', __init__)

а не:

B.__init__ = __init__

?
Это идентичный код. Просто setattr акцентирует внимание на том, что класс по большому счету словарь.
Я внимательно читал статьи на IBM. Статья вводная, и предназначена для тех, кто знакомится с интерпретируемыми языками.
если там вводная(их 3 части кстати), то тут тогда что?
«Вводная», это значит — как бы я рассказал, о метаклассах в питоне программистам, которые его знают. Я не претендую на соревнование со статьями IBM, или их подробный пересказ.
извините, не так вас понял комментарием выше
а дальше? примеры попрактичнее в студию!
Поддерживаю. Расскажите как на практике это все применялось Вами.
ок. Следующий пост об этом.
Это, конечно, все хорошо. В принципе, работая на Питоне, эти фишки все по крайней мере знают с туториалов или того же IBM DeveloperWorks.

Но… Реально, для чего используются метаклассы? Где есть смысл их применять, в какой момент это становится рациональным и не мешает читаемости программ?
> Где есть смысл их применять, в какой момент это становится рациональным и не мешает читаемости программ?

Если метакласс позволяет в три строки сделать то, на что раньше уходил целый талмуд, то он становится рациональным и не мешает читаемости программ. :)
UFO just landed and posted this here
можно еще создавать новый классобъект на основе классов.

from new import classobj
С = classobj('NewClass',(A,B),{})
с = С()

Иногда полезно когда хочется получить импортируемые классы которые наследуют классы в текущем модуле.
Через type помоему нельзя.
Можно же.

С = type('NewClass', (A,B), {})
с = С()
Вы пробовали? У меня не получается, выдает исключение.

>>> class A: pass
...
>>> class B: pass
...
>>> C = type('C',(A,B),{})
Traceback (most recent call last):
File "", line 1, in TypeError: a new-style class can't have only classic bases
>>> from new import classobj
>>> C = classobj('C', (A,B),{})
>>> c = C()
>>>
Конечно пробовал.

Да и в исключении ясным английским языком написано в чем ваша ошибка.

>>> class A(object): pass

>>> class B(object): pass

>>> C = type('C', (A, B), {})
>>> c = C()
>>>

Ну и такой вам тонкий намек: «classic classes» и модуль new — deprecated и в питоне 3 удалены.
Конечно оффтопик, но у меня при чтении глаз цеплялся за лишние запятые в тексте.
Спасибо за статью, сам сейчас Python изучаю.
Про метапрограммирование в статье как раз мало чего. Она толи о __dict__, толи о том, что все методы не более чем обычные функции с дополнительной обвязкой, толи еще о чем-то…

На мой взгляд автору следовало бы раскрыть какой-нибудь один вопрос, но подробно. А получилось «Ухты, вот так можно. А я еще знаю, что и вот так можно, и вот так».
Sign up to leave a comment.

Articles