如何获取对象类定义的模块名而非对象实例化的模块名?
在Python 2.5中,我有一个叫做modtest.py的模块,里面有以下代码:
def print_method_module(method):
def printer(self):
print self.__module__
return method(self)
return printer
class ModTest():
@print_method_module
def testmethod(self):
pass
if __name__ == "__main__":
ModTest().testmethod()
但是,当我运行这个代码时,它输出的是:
__main__
如果我创建一个叫做modtest2.py的第二个文件并运行它:
import modtest
if __name__ == "__main__":
modtest.ModTest().testmethod()
这时输出的是:
modtest
我该如何修改装饰器,让它总是输出modtest
,也就是定义这个类的模块的名字呢?
2 个回答
-2
我猜你可以用 sys._getframe() 这个小技巧来获取你想要的东西。
19
当你直接运行一个Python源文件时,这个文件的模块名称会被称为 __main__
,即使在你运行其他文件并导入它时,它可能有另一个名字。
你可能想像在modtest2中那样,导入包含类定义的模块,而不是直接执行那个文件。不过,你可以这样获取主模块的文件名,方便你进行调试:
def print_method_module(method):
def printer(self):
name = self.__module__
if name == '__main__':
filename = sys.modules[self.__module__].__file__
name = os.path.splitext(os.path.basename(filename))[0]
print name
return method(self)
return printer