如何获取对象类定义的模块名而非对象实例化的模块名?

25 投票
2 回答
36451 浏览
提问于 2025-04-15 19:24

在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

撰写回答