在模块级别使用Python中的属性别名

Mas*_*ind 3 python python-2.7

我在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)

有没有办法做到这一点?

eca*_*mur 5

是的,一点没错; 关键是模块本身就是对象.首先,您需要将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)

请注意,这对静态分析器和阅读代码的人来说非常困惑.