模块可以有属性吗?

Cas*_*all 6 python module properties

是否可以向模块添加属性和特殊方法?我想定义一个模块,以便导入它就像一个类实例,并且正文充当类定义.从本质上讲,这是为了避免像这样丑陋的语法:

import game
if game.Game().paused:
    print("The game is paused")
Run Code Online (Sandbox Code Playgroud)

例如,游戏模块看起来像这样:

_Speed = 1

@property
def paused():
    return _Speed == 0
Run Code Online (Sandbox Code Playgroud)

并使用它的文件:

import game
if game.paused:
    print("The game is paused")
Run Code Online (Sandbox Code Playgroud)

另外,是否可以定义特殊方法(例如__call__)?

要清楚,我不区分类/实例方法,因为我使用的game.Game是singleton/borg类.

我已经使用@property和定义进行了测试__bool__,但都没有像我希望的那样行事.

编辑(有关我为什么要使用属性的信息):

我有一个属性game.speed,一个函数game.paused()和一个函数game.pause(bool).从本质上讲,我有一个临时变量,用于在游戏暂停时存储游戏速度.有一个私人速度变量在游戏暂停时设置为零.我从不希望用户将速度视为零,并且能够在游戏暂停时修改速度,以便在游戏恢复时使用新的速度.

kin*_*all 12

Python并不关心sys.modules实际上是什么模块.所以你可以:

# game.py
class Game(object):
    pass

import sys
sys.modules["game"] = Game()
Run Code Online (Sandbox Code Playgroud)

现在其他模块import game将获取Game实例,而不是原始模块.

我不确定我推荐它,但它会做你想要的.

  • 哇.这是一些黑魔法. (4认同)