我需要在运行时添加模块属性。例如,加载模块时,它会读取包含数据的文件。我希望这些数据可用作模块属性,但数据仅在运行时可用。
如何在运行时添加模块属性?
答案 0 :(得分:25)
谢谢@Dharmesh。这就是我所需要的。只需要进行一项更改。模块不会自行导入,以便获取我可以执行的模块对象:
setattr(sys.modules[__name__], 'attr1', 'attr1')
答案 1 :(得分:10)
如果在运行时之前不知道属性名称,请使用setattr
:
>>> import mymodule
>>> setattr(mymodule, 'point', (1.0, 4.0))
>>> mymodule.point
(1.0, 4.0)
答案 2 :(得分:3)
模块属性是模块全局范围内的变量。
如果要“在运行时”从模块本身设置属性,则正确的方法是
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
答案 3 :(得分:1)
设置它。
my_object = MyObject()
my_object.my_custom_attribute = 'my_value'
答案 4 :(得分:1)
创建动态类'Module'并使用以下字典动态添加属性:
attributes = {'attr1': 'attr1', 'attr2': 'attr2'}
module = type('Module', (), attributes)
或仅创建动态类'模块'
module = type('Module', (), {})
并使用setattr方法添加属性,如下所示:
setattr(module, 'attr3', 'attr3')
OR
import module
setattr(module, 'attr1', 'attr1')
答案 5 :(得分:0)
将其添加为对象的内部字典__dict __
的键my_object.__dict__['newattribute'] = 'attributevalue'
答案 6 :(得分:-7)
模块的全局范围是模块本身,所以只需设置一个全局。
# module.py
a = 1
# script.py
import module
print module.a
# 1