__getattr__
и __setattr__
хорошо работают, когда я получаю или устанавливаю атрибуты объекта с помощью точечной нотации.Как перехватить получение и установку глобальных переменных модуля изнутри модуля?
I Тип модуля подкласса:
from types import ModuleType
class WUserModule(ModuleType):
def __init__(self, name):
super().__init__(name)
def __setattr__(self, name, value):
if name in self.__dict__:
super().__setattr__(name, value)
return
print('Set name {}, value {}'.format(name, str(value)))
def __getattr__(self, name):
print('Get name {}'.format(name))
Создать пустой модуль и загрузить в него код:
module = WUserModule('form_module')
with open('user_module.py', 'r', encoding='utf8') as f:
exec(f.read(), module.__dict__)
Код, загруженный из user_module.py
:
a=1
print(a)
Мне нужно как-то перехватить доступ к переменной a
.В загруженном коде ожидается доступ к некоторым переменным, которых нет в модуле globals()
, и я хочу заменить запрошенные значения.
ОБНОВЛЕНИЕ:
Приведенный выше код не работает, как япотребность: доступ к переменной a
не отражается print
.
Я использую PyQt4 для написания «платформы», где другие пользователи (программисты) добавляют формы и модули, которые обрабатывают взаимодействие с этими формами.Сама форма доступна в пользовательском модуле через введенную переменную form
.Я хочу предоставить пользователям возможность доступа к значениям из виджетов форм и более простой способ.Вместо того, чтобы писать if form.myCheckbox.isChecked()
или form.myCheckbox.setChecked(myValue)
, я хочу предоставить ярлык: if myCheckbox
и myCheckbox = myValue
, перехватывая доступ к значениям и заставляя необходимую работу в фоновом режиме:
def __getattr__(self, name):
formWidget = getatttr(form, name)
if isinstance(formWidget, QLineEdit):
formWidget.setText(value)
...