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

时间:2011-03-18 16:04:08

标签: python

我需要在运行时添加模块属性。例如,加载模块时,它会读取包含数据的文件。我希望这些数据可用作模块属性,但数据仅在运行时可用。

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

7 个答案:

答案 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