Подтвердить что ты не робот

Как получить имя модуля определения класса объекта, а не имя модуля объекта-объекта?

В 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, имя модуля, в котором определен класс?

4b9b3361

Ответ 1

Когда вы запускаете исходный файл 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

Ответ 2

Я предполагаю, что вы можете использовать sys._getframe() хакерство, чтобы получить то, что вы хотите.