我在Python 2.7中有以下内容:
class MyClass(object):
...
@property
def my_attr(self):
...
@my_attr.setter
def my_attr(self, value):
...
Run Code Online (Sandbox Code Playgroud)
我使用getter/setter,这样我就可以在那里做一些逻辑.
然后我可以打电话:
import myModule
test = myModule.MyClass()
test.my_attr = 9
Run Code Online (Sandbox Code Playgroud)
我想在模块级别使用别名,以便我可以做类似的事情:
import myModule
myModule.my_attr = 9
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
是的,一点没错; 关键是模块本身就是对象.首先,您需要将MyClass子类设为模块类型:
from types import ModuleType
class MyClass(ModuleType):
...
Run Code Online (Sandbox Code Playgroud)
然后用MyClass实例替换当前模块:
import sys
sys.modules[__name__] = MyClass(__name__)
Run Code Online (Sandbox Code Playgroud)
请注意,这对静态分析器和阅读代码的人来说非常困惑.