如何在运行时向模块添加属性?
我需要在程序运行时给模块添加一些属性。比如,当一个模块被加载时,它会读取一个文件,里面包含了一些数据。我希望这些数据能作为模块的属性可用,但这些数据只有在程序运行时才能获取。
那么,我该如何在运行时给模块添加属性呢?
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')