__getattr__
和__setattr__
當我使用點符號獲取或設置對象的屬性時,效果很好。 如何攔截模塊內部的獲取和設置模塊全局變量?當訪問全局變量時,模塊的__setattr__和__getattr__
我子模塊類型:
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()
中不存在的一些變量,並且我想替換請求的值。
UPDATE:
上述代碼作爲我需要不工作:訪問變量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)
...
爲什麼你想這樣做? – 2010-12-13 18:53:16
你真正的問題是什麼,因爲你似乎已經回答了「我如何攔截從模塊內部獲取和設置模塊全局變量?」? – 2010-12-13 18:54:06