如何获取对象类定义的模块名称而不是对象实例的模块名称?

时间:2010-02-17 16:22:02

标签: python

在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 个答案:

答案 0 :(得分:13)

当您直接执行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

答案 1 :(得分:-1)

我猜你可以使用sys._getframe()hackery来获得你想要的东西。