Форум сайта python.su
Допустим есть модуль:
# module1.py
def prop1():
return 'AAA'
# module2.py
import module1
print module1.prop1 # должна печатать 'AAA'
Офлайн
А попробовать самому и не забыть “()” написать?
Офлайн
Daevaorn: я так понял товарищу нужно что-то типа @property.
Отредактировано (Июнь 10, 2010 18:41:03)
Офлайн
truporezДа! Что-то типа @property, только на уровне модуля. Но, судя по-всему - не получится.
Daevaorn: я так понял товарищу нужно что-то типа @property.
Офлайн
Ну почему же? Можно.
prop1 = 'AAA'
Офлайн
Скажу больше: можно даже унаследоваться от types.ModuleType - и за это ничего не будет; а свойства и прочие дескрипторы - заработают.
Только оно - нужно?
Офлайн
Андрей СветловJust for fun! :-)
Только оно - нужно?
Офлайн
Андрей СветловВообще то уже нет… Просто загорелся где то дым “сделать красивый ленивый синглетон”…
Только оно - нужно?
ZZZага :)
Just for fun! :-)
Офлайн
Кажется, оно и так достаточно красиво.
Дело в том, что модуль - это _реализация_ класса ModuleType. property (как и любой другой дескриптор) требует _наследования_ - чтобы в классе были атрибуты с методами __get__. Это - другая модель, и Питон не поддерживает ее явно “из коробки”. По целому ряду причин - и это не поменяется еще как минимум лет десять. Да и не нужно менять, наверное.
Но, поскольку все - объект, наследоваться от модуля технически можно и есть способ создавать расширения импорта - то можно сделать import hook, который бы решал данную задачу.
Если интерес еще не пропал - могу рассказать, как. Но для начала вы должны четко представлять, как работает дескриптор…
Академически, возможно, это интересная задачка - но пока не вижу настоящих применений.
Много кода, не вполне очевидные мне “темные углы” и, главное - неясная семантика.
Модуль - синглетон. Функции модуля можно рассматривать как статические методы - а не как методы класса. Как быть с classmethod и staticmethod в этом случае? Что будет означать global - вопрос вопросов? Вопросов больше чем ответов. Ведь концепт _класса_ - это гораздо больше чем просто возможность писать @property… Кажется, лучше оставить все как есть.
Офлайн
Вообщем я понял, как это можно сделать. Ну и главное - я понял что это делать не нужно :)
Офлайн