可调用的模块
为什么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
工作正常。