我有一个模块,其中包含如下使用的方法
import module
print(module.location())
print(module.info2())
是否有Python方式将这些方法转换为属性,所以我可以做
print(module.location)
print(module.info2)
?
答案 0 :(得分:1)
Python实际上并不关心sys.modules
中列出的模块实际上是一个模块。因此这在技术上是可能的。例如:
使用这些方法作为属性定义一个类。
class Module:
@property
def location(self):
return _location
实例化课程。
module = Module()
最后,将sys.modules
中的模块引用替换为对该实例的引用。
import sys
sys.modules[__name__] = module
但是,可以考虑只编写类并在模块中创建一个实例,然后使用以下命令将其导入:
from module import module
然后很明显,您从模块中得到了 ,这并不奇怪。
答案 1 :(得分:1)
如果您使用的是Python3.7 +,并且控制了module
的源代码,则可以在__getattr__
上创建一个module
方法来部分模拟属性行为。
def _location():
return 'here'
def _info2():
return 'Some info'
def __getattr__(name):
if name == 'info2':
return _info2()
elif name == 'location':
return _location()
raise AttributeError(f'No attribute {name}')
>>> import module
>>> module.location
'here'
>>> module.info2
'Some info'
但是,没有什么可以阻止属性的显式设置,它会覆盖__getattr__
:
>>> module.info2 = 'foo'
>>> module.info2
'foo'
模块级__getattr__
的PEP为here。