Комментарии 34
Спасибо! Хоть до конца магию метапрограммирования еще не постиг, но пост как раз в тему. + вам. Ну и в тематический блог Язык программирования Python перенесите потом, плиз.
0
И, наконец, при поиске элемента v3 обращаемся к словарю родителю B-A, и достаем его оттуда
v3?
+1
> позволено «на лету» определять классы
в Python'e 3000 доступен также метод __build_class__
в Python'e 3000 доступен также метод __build_class__
0
Что то у меня сомнение вызывает эта фраза — «Классы в питоне есть экземпляры метаклассов». Да и вообще — связка A есть B вышла из употребления в русском языке давным давно. Или автор англоязычный?
В общем статья весьма низкого уровня, уж извините.
В общем статья весьма низкого уровня, уж извините.
-2
Интересно… Но пугает весёлость :-) Обычно весёлые программы веселят только автора и только в момент написания, а вот если потом надо это фиксить, развивать, адаптировать под новые реалии… вот тут вся весёлость может пропасть. Я бы четырежды подумал, прежде, чем делать что-то весёлое; вот такой я унылый :-)
0
На таких веселостях очень классные вещи делаются, к примеру Django.
0
У Django есть смягчающие обстоятельства.
1. Она документирована и не заставляет вас разбираться с реализацией. Весёлые программы обычно не обладают таким свойством.
2. Там эта технология используется умеренно. Обычно setattr натравливается на self или на что-то ещё внутри объекта. Я не знаю случаев (хотя скорее всего они есть), когда там создаётся новый объект прям с нуля через type+setattr.
Одним словом, мне не кажется, что Django писали сильно веселясь. Напротив, люди много думали и уныло документировали :-)
1. Она документирована и не заставляет вас разбираться с реализацией. Весёлые программы обычно не обладают таким свойством.
2. Там эта технология используется умеренно. Обычно setattr натравливается на self или на что-то ещё внутри объекта. Я не знаю случаев (хотя скорее всего они есть), когда там создаётся новый объект прям с нуля через type+setattr.
Одним словом, мне не кажется, что Django писали сильно веселясь. Напротив, люди много думали и уныло документировали :-)
0
Показаны какие-то метаклассы. Не понимаю, какое отношение это имеет к метапрограммированию?
0
Почему:
setattr(B, '__init__', __init__)
а не:
B.__init__ = __init__
?
setattr(B, '__init__', __init__)
а не:
B.__init__ = __init__
?
0
тема метаклассов не раскрыта, почитайте на том же www.ibm.com/developerworks/ru/library/l-pymeta/index.html
куда более полное и предметное описание черной магии
куда более полное и предметное описание черной магии
+1
а дальше? примеры попрактичнее в студию!
+2
Это, конечно, все хорошо. В принципе, работая на Питоне, эти фишки все по крайней мере знают с туториалов или того же IBM DeveloperWorks.
Но… Реально, для чего используются метаклассы? Где есть смысл их применять, в какой момент это становится рациональным и не мешает читаемости программ?
Но… Реально, для чего используются метаклассы? Где есть смысл их применять, в какой момент это становится рациональным и не мешает читаемости программ?
+1
НЛО прилетело и опубликовало эту надпись здесь
можно еще создавать новый классобъект на основе классов.
from new import classobj
С = classobj('NewClass',(A,B),{})
с = С()
Иногда полезно когда хочется получить импортируемые классы которые наследуют классы в текущем модуле.
Через type помоему нельзя.
from new import classobj
С = classobj('NewClass',(A,B),{})
с = С()
Иногда полезно когда хочется получить импортируемые классы которые наследуют классы в текущем модуле.
Через type помоему нельзя.
0
Можно же.
С = type('NewClass', (A,B), {})
с = С()
С = type('NewClass', (A,B), {})
с = С()
0
Вы пробовали? У меня не получается, выдает исключение.
>>> 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()
>>>
0
Конечно оффтопик, но у меня при чтении глаз цеплялся за лишние запятые в тексте.
Спасибо за статью, сам сейчас Python изучаю.
Спасибо за статью, сам сейчас Python изучаю.
-1
Про метапрограммирование в статье как раз мало чего. Она толи о __dict__, толи о том, что все методы не более чем обычные функции с дополнительной обвязкой, толи еще о чем-то…
На мой взгляд автору следовало бы раскрыть какой-нибудь один вопрос, но подробно. А получилось «Ухты, вот так можно. А я еще знаю, что и вот так можно, и вот так».
На мой взгляд автору следовало бы раскрыть какой-нибудь один вопрос, но подробно. А получилось «Ухты, вот так можно. А я еще знаю, что и вот так можно, и вот так».
+3
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Заметки о метапрограммировании в Python