我需要在运行时添加模块属性。例如,当加载模块时,它会读取包含数据的文件。我希望该数据作为模块属性可用,但该数据仅在运行时可用。
如何在运行时添加模块属性?
我需要在运行时添加模块属性。例如,当加载模块时,它会读取包含数据的文件。我希望该数据作为模块属性可用,但该数据仅在运行时可用。
如何在运行时添加模块属性?
感谢@Dharmesh。这正是我所需要的。只需进行一处更改。由于该模块不会导入自身,因此可以执行以下操作来获取模块对象:
setattr(sys.modules[__name__], 'attr1', 'attr1')
如果你直到运行时才知道属性的名称,请使用 setattr
:
>>> import mymodule
>>> setattr(mymodule, 'point', (1.0, 4.0))
>>> mymodule.point
(1.0, 4.0)
模块属性是模块全局范围内的变量。
如果您想要在“运行时”从模块本身设置属性,则正确的方法是
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
attributes = {'attr1': 'attr1', 'attr2': 'attr2'}
module = type('Module', (), attributes)
或者只创建动态类'Module'
module = type('Module', (), {})
并使用setattr方法添加属性,如下所示:
setattr(module, 'attr3', 'attr3')
或者
import module
setattr(module, 'attr1', 'attr1')
只需设置它。
my_object = MyObject()
my_object.my_custom_attribute = 'my_value'
setattr(my_object, my_key, 'my_value')
即可。 - Daniel Rosemansetattr()
(并且@Daniel Roseman在他的评论中提到)。可能的替代方法是提供一个预定义的模块方法,该方法接受属性名称作为参数并返回其值(或类似的内容)。 - martineaumy_object.__dict__['newattribute'] = 'attributevalue'
# module.py
a = 1
# script.py
import module
print module.a
# 1