在方法中使用__name__
引用定义类的模块。
是否有办法让对象获取已实例化的模块?
答案 0 :(得分:1)
所以 - Python的动态允许函数检查调用它的帧对象。
如果您可以将模块显式传递给类构造函数,那会更好:
class MyObject:
def __init__(self, module):
self.module = module
...
在其他文件中:
m = MyObject(__name__)
但是,正如我在第一行中提到的,你可以进入代码调用
一个模块 - 如果你有一个专门的元类,那么调用一个类__init__
的代码就是实例化对象的地方。所以你可以写:
import inspect
class MyObject:
def __init__(self, module):
caller_frame = inspect.currentframe().f_back
self.module = caller_frame.f_globals.get("__name__", "<unknown module>")
...
Frame对象是一个内部Python对象,它在程序运行时保持代码上下文的执行状态。它包含对该框架可用的全局变量和局部变量的引用,以及代码对象,当前源代码行等。最上面的帧(0)是执行中的当前帧 - 第二个到顶部(1)是当前函数/方法的直接调用者。框架.f_globals
属性是对全局字典的直接引用 - 如果在该框架内调用globals()
,则返回相同的内容。