如何获取子类的文件名?
示例:
base.py
:
class BaseClass:
def __init__(self):
# How to get the path "./main1.py"?
main1.py
:
from base import BaseClass
class MainClass1(BaseClass):
pass
答案 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__
的时间。
足够让您获得正确的文档吗?