如何获取子类的文件名?

时间:2019-01-10 16:49:06

标签: python python-3.x inheritance

如何获取子类的文件名?

示例:

base.py

class BaseClass:
    def __init__(self):
        # How to get the path "./main1.py"?

main1.py

from base import BaseClass

class MainClass1(BaseClass):
    pass

3 个答案:

答案 0 :(得分:2)

请记住,self中的BaseClass.__init__是正在初始化的实际类的实例。因此,一种解决方案是询问该类它来自哪个模块,然后询问该模块的路径:

import importlib

class BaseClass:
    def __init__(self):
        m = importlib.import_module(self.__module__)
        print m.__file__

我认为可能有很多方法可以使您最终无法导入模块。这似乎不是最可靠的解决方案。

如果您要做的只是确定子类的来源,那么将模块名称和类名称组合起来就足够了,因为应该可以唯一地标识它:

class BaseClass:
    def __init__(self):
        print "{}.{}".format(
            self.__module__,
            self.__class__.__name__
        )

答案 1 :(得分:1)

您可以通过返回调用堆栈来获取BaseClass.__init__()方法的调用者的全局名称空间来实现,然后您可以通过使用值提取文件所在的名称。 __file__键入。

这是我的意思:

base.py

import sys

class BaseClass(object):
    def __init__(self):
        print('In BaseClass.__init__()')
        callers_path = sys._getframe(1).f_globals['__file__']
        print('  callers_path:', callers_path)

main1.py

from base import BaseClass

class MainClass1(BaseClass):
    def __init(self):
        super().__init__()

mainclass1 = MainClass1()

正在运行的main1.py的示例输出:

In BaseClass.__init__()
  callers_path: the\path\to\main1.py

答案 2 :(得分:0)

我认为您正在寻找错误的解决方案机制。您的意见表明,您需要的是具有最少追溯功能的异常处理程序。在一般的class机制中,这不是很容易处理的事情。

相反,您应该研究Python的堆栈检查功能。很简单,您希望您的__init__方法报告调用子类的文件名。您可以要求调用者传递自己的__file__值,以达到此目的。您可以自动方式回溯一个堆栈框架并通过该上下文记录访问__file__。请注意,这种方法假定,您唯一需要此信息的时间是直接从子类方法中调用__init__的时间。

足够让您获得正确的文档吗?