可调用的模块

为什么Python不允许模块拥有__call__ ? (除了显而易见的是直接导入并不容易)。具体来说,为什么不使用a(b)语法find__call__属性,就像它对函数,类和对象所做的那样? (查找只是模块不相容的不同?)

 >>> print open("mod_call.py").read() def __call__(): return 42 >>> import mod_call >>> mod_call() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'module' object is not callable >>> mod_call.__call__() 42 

特殊的方法只能保证在types上定义,而不是在实例上定义。 ( __call__是模块实例mod_call的属性,而不是<type 'module'> mod_call <type 'module'>的属性。)不能将方法添加到内置types。

http://docs.python.org/reference/datamodel.html#special-method-lookup-for-new-style-classes

Python不允许模块重写或添加任何魔术方法,因为保持模块对象简单,规则和轻量级是非常有利的,因为很less有强用例出现在可以使用魔术方法的地方。

当出现这样的用例时,解决scheme是将一个类实例伪装成一个模块。 具体来说,编码你的mod_call.py如下:

 import sys class mod_call(object): def __call__(self): return 42 sys.modules[__name__] = mod_call() 

现在你的代码导入和调用mod_call工作正常。