要为模块的某些属性提供特殊处理,您可以定义一个代理类来执行特殊处理并将其余部分委托给原始模块对象:
"""
>>> import property_on_module
>>> property_on_module.attr = 1
set attr property
>>> property_on_module.attr
get attr property
1
"""
import sys
class Module(object):
def __init__(self, module):
self.__module = module
def __getattr__(self, name):
return getattr(self.__module, name)
@property
def attr(self):
print("get attr property")
return self.__attr
@attr.setter
def attr(self, value):
print("set attr property")
self.__attr = value
if __name__ == "__main__": # test if run as a script
import doctest
sys.exit(doctest.testmod().failed)
else: # normal import, use `Module` class to provide `attr` property
sys.modules[__name__] = Module(sys.modules[__name__])
__getattr__
可能还不够;您可以__getattribute__/__setattr__
在这种情况下定义,例如quickdraw.py
(基于sh.py
)。