使模块方法像@property一样?

时间:2018-08-23 18:27:08

标签: python python-3.x oop methods properties

我有一个模块,其中包含如下使用的方法

import module
print(module.location())
print(module.info2())

是否有Python方式将这些方法转换为属性,所以我可以做

print(module.location)
print(module.info2)

2 个答案:

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