Найти - Пользователи
Полная версия: Можно ли обращатся к функции модуля как к свойству объекта
Начало » Python для экспертов » Можно ли обращатся к функции модуля как к свойству объекта
1
gkraser
Допустим есть модуль:
#  module1.py

def prop1():
return 'AAA'
Можно ли организовать такой финт? :

#  module2.py

import module1

print module1.prop1 # должна печатать 'AAA'
Александр Кошелев
А попробовать самому и не забыть “()” написать?
truporez
Daevaorn: я так понял товарищу нужно что-то типа @property.
gkraser
truporez
Daevaorn: я так понял товарищу нужно что-то типа @property.
Да! Что-то типа @property, только на уровне модуля. Но, судя по-всему - не получится.
ZZZ
Ну почему же? Можно.
prop1 = 'AAA'
:-)

А если серьёзно, то нужно в sys.modules подменить этот модуль объектом, в котором и будут property.
Одним словом – копать импорт.
Андрей Светлов
Скажу больше: можно даже унаследоваться от types.ModuleType - и за это ничего не будет; а свойства и прочие дескрипторы - заработают.
Только оно - нужно?
ZZZ
Андрей Светлов
Только оно - нужно?
Just for fun! :-)
gkraser
Андрей Светлов
Только оно - нужно?
Вообще то уже нет… Просто загорелся где то дым “сделать красивый ленивый синглетон”…

ZZZ
Just for fun! :-)
ага :)
Андрей Светлов
Кажется, оно и так достаточно красиво.
Дело в том, что модуль - это _реализация_ класса ModuleType. property (как и любой другой дескриптор) требует _наследования_ - чтобы в классе были атрибуты с методами __get__. Это - другая модель, и Питон не поддерживает ее явно “из коробки”. По целому ряду причин - и это не поменяется еще как минимум лет десять. Да и не нужно менять, наверное.
Но, поскольку все - объект, наследоваться от модуля технически можно и есть способ создавать расширения импорта - то можно сделать import hook, который бы решал данную задачу.

Если интерес еще не пропал - могу рассказать, как. Но для начала вы должны четко представлять, как работает дескриптор…

Академически, возможно, это интересная задачка - но пока не вижу настоящих применений.
Много кода, не вполне очевидные мне “темные углы” и, главное - неясная семантика.
Модуль - синглетон. Функции модуля можно рассматривать как статические методы - а не как методы класса. Как быть с classmethod и staticmethod в этом случае? Что будет означать global - вопрос вопросов? Вопросов больше чем ответов. Ведь концепт _класса_ - это гораздо больше чем просто возможность писать @property… Кажется, лучше оставить все как есть.
gkraser
Вообщем я понял, как это можно сделать. Ну и главное - я понял что это делать не нужно :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB