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

Bre*_*wey 17 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()
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,它打印出来:

__main__
Run Code Online (Sandbox Code Playgroud)

如果我创建一个名为modtest2.py的第二个文件并运行它:

import modtest

if __name__ == "__main__":
    modtest.ModTest().testmethod()
Run Code Online (Sandbox Code Playgroud)

打印出:

modtest
Run Code Online (Sandbox Code Playgroud)

如何将装饰器更改为始终打印出来modtest,即定义类的模块的名称?

Mat*_*son 15

当您直接执行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
Run Code Online (Sandbox Code Playgroud)