【发布时间】:2012-04-13 19:15:31
【问题描述】:
是否可以向模块添加属性和特殊方法?我想定义一个模块,以便导入它就像一个类实例,而主体充当一个类定义。本质上,它是为了避免像这样丑陋的语法:
import game
if game.Game().paused:
print("The game is paused")
例如游戏模块如下所示:
_Speed = 1
@property
def paused():
return _Speed == 0
以及使用它的文件:
import game
if game.paused:
print("The game is paused")
另外,是否可以定义特殊方法(如__call__)?
需要明确的是,我不区分类/实例方法,因为我使用 game.Game 作为单例/borg 类。
我已经使用@property 进行了测试并定义了__bool__,但都没有达到我的预期。
编辑(关于我为什么要使用属性的信息):
我有一个属性game.speed、一个函数game.paused() 和一个函数game.pause(bool)。本质上,我有一个临时变量,用于在游戏暂停时存储游戏速度。当游戏暂停时,有一个私有速度变量设置为零。我从不希望用户看到速度为零,并且能够在游戏暂停时修改速度,以便在游戏恢复时使用新的速度。
【问题讨论】:
-
为什么不直接使用
from game import Game? -
属性如何工作?元类?元类如何引用 Game 类?
-
我是说如果你使用
from ... import语法,你不需要 模块的属性。使用你的模块的人不会期望它上面有属性,所以如果你从模块中删除属性并在你自己的代码中简单地使用form ... import,你可以获得相同的可读性,但你的 API 会更好地符合其他程序员' 期望,这是一件好事。 -
我用更多信息更新了我的帖子。我有计算出来的值,但应该作为属性(而不是函数)。
-
Related: stackoverflow.com/q/880530/936083 -- 如果我将方法直接添加到模块对象,这可能会起作用吗?
标签: python properties module