如何在运行时向模块添加属性?

28 投票
7 回答
20471 浏览
提问于 2025-04-16 13:58

我需要在程序运行时给模块添加一些属性。比如,当一个模块被加载时,它会读取一个文件,里面包含了一些数据。我希望这些数据能作为模块的属性可用,但这些数据只有在程序运行时才能获取。

那么,我该如何在运行时给模块添加属性呢?

7 个回答

5

模块属性就是模块全局范围内的一个变量。

如果你想在程序运行时从模块内部设置一个属性,正确的方法是:

globals()['name'] = value

(注意:这种方法只适用于全局变量,不适用于局部变量。)

如果你想在导入模块的地方设置一个属性,只需直接设置它:

import myModule
setattr(myModule, 'name', 10)

完整示例:

#m.py
def setGlobal(name, value):
    globals()[name] = value

--

#main.py
import m

m.setGlobal('foo', 10)
print(m.foo) #--> 10

#Moreover:

from m import foo
print(foo) #--> 10   (as Expected)

m.setGlobal('foo', 20)
print(m.foo) #--> 20  (also as expected)

#But:
print(foo) #--> 10
18

如果你在程序运行的时候才知道属性的名字,可以使用 setattr 这个方法:

>>> import mymodule
>>> setattr(mymodule, 'point', (1.0, 4.0))
>>> mymodule.point
(1.0, 4.0)
45

谢谢你,@Dharmesh。这正是我需要的。只需要做一个小改动。这个模块不会自己导入,所以为了获取模块对象,我可以这样做:

setattr(sys.modules[__name__], 'attr1', 'attr1')

撰写回答