访问全局参数时,模块的“setattr”和“getattr”

2024-06-08 23:53:02 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用点表示法获取或设置对象的属性时,__getattr__和{}工作得很好。 如何从模块内部拦截获取和设置模块全局变量?在

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))

创建空模块并将代码加载到其中:

^{pr2}$

user_module.py加载的代码:

a=1
print(a)

我需要以某种方式拦截对变量a的访问。在加载的代码中,预期会访问模块globals()中不存在的某些变量,我想替换请求的值。在

更新:

上面的代码不能按我的需要工作:对变量a的访问不是由print反映的。在

我使用PyQt4编写一个“平台”,在这个平台上,其他用户(程序员)添加处理与这些表单交互的表单和模块。表单本身可以通过“injected”变量form在用户模块中访问。我想给用户提供从窗体小部件访问值的可能性,以及一种更简单的方法。我不想写if form.myCheckbox.isChecked()form.myCheckbox.setChecked(myValue),而是提供一个快捷方式:if myCheckbox和{},拦截值访问并在后台进行所需的工作:

def __getattr__(self, name):
    formWidget = getatttr(form, name)
    if isinstance(formWidget, QLineEdit):
        formWidget.setText(value)
...

Tags: 模块代码用户nameselfform表单if
2条回答

你不能

基本问题是,属性重载仅在您访问属性时才起作用,这意味着:

expr.ident

没有点,就没有属性重载。因此,无论你做什么,一个序列

^{pr2}$

永远不能调用属性重载,不管其他什么可能等于a的值。在

你想做的事在一般情况下是做不到的。属性不能同时具有值和属性。您可以同时执行form.myCheckbox = Truebool(form.myCheckbox)form.myCheckbox.setChecked(True)和{},不是。我的意思是,form.myCheckbox不能同时是TrueQCheckbox对象。你可以让它工作,因为boolint和{}可以处理,但很不方便,而其他类型通常是不可能的。在

除此之外,您还对__getattr__的作用感到困惑。它不是为存在的属性调用的,__getattribute__是。但是使用__getattribute__是很复杂的,你可能想让你的复选框成为描述符或者使用属性,但是你必须放弃模块而使用类。在

为什么表单是一个模块,而不是某个对象的实例?在

相关问题 更多 >