gkraser
Июнь 10, 2010 14:33:34
Допустим есть модуль:
# module1.py
def prop1():
return 'AAA'
Можно ли организовать такой финт? :
# module2.py
import module1
print module1.prop1 # должна печатать 'AAA'
Александр Кошелев
Июнь 10, 2010 16:32:44
А попробовать самому и не забыть “()” написать?
truporez
Июнь 10, 2010 18:39:20
Daevaorn: я так понял товарищу нужно что-то типа @property.
gkraser
Июнь 10, 2010 19:31:03
truporez
Daevaorn: я так понял товарищу нужно что-то типа @property.
Да! Что-то типа @property, только на уровне модуля. Но, судя по-всему - не получится.
ZZZ
Июнь 11, 2010 11:50:15
Ну почему же? Можно.
:-)
А если серьёзно, то нужно в sys.modules подменить этот модуль объектом, в котором и будут property.
Одним словом – копать импорт.
Андрей Светлов
Июнь 11, 2010 12:12:46
Скажу больше: можно даже унаследоваться от types.ModuleType - и за это ничего не будет; а свойства и прочие дескрипторы - заработают.
Только оно - нужно?
gkraser
Июнь 11, 2010 15:08:31
Андрей Светлов
Только оно - нужно?
Вообще то уже нет… Просто загорелся где то дым “сделать красивый ленивый синглетон”…
ZZZ
Just for fun! :-)
ага :)
Андрей Светлов
Июнь 11, 2010 18:29:09
Кажется, оно и так достаточно красиво.
Дело в том, что модуль - это _реализация_ класса ModuleType. property (как и любой другой дескриптор) требует _наследования_ - чтобы в классе были атрибуты с методами __get__. Это - другая модель, и Питон не поддерживает ее явно “из коробки”. По целому ряду причин - и это не поменяется еще как минимум лет десять. Да и не нужно менять, наверное.
Но, поскольку все - объект, наследоваться от модуля технически можно и есть способ создавать расширения импорта - то можно сделать import hook, который бы решал данную задачу.
Если интерес еще не пропал - могу рассказать, как. Но для начала вы должны четко представлять, как работает дескриптор…
Академически, возможно, это интересная задачка - но пока не вижу настоящих применений.
Много кода, не вполне очевидные мне “темные углы” и, главное - неясная семантика.
Модуль - синглетон. Функции модуля можно рассматривать как статические методы - а не как методы класса. Как быть с classmethod и staticmethod в этом случае? Что будет означать global - вопрос вопросов? Вопросов больше чем ответов. Ведь концепт _класса_ - это гораздо больше чем просто возможность писать @property… Кажется, лучше оставить все как есть.
gkraser
Июнь 12, 2010 08:45:50
Вообщем я понял, как это можно сделать. Ну и главное - я понял что это делать не нужно :)