Python中的实例模块

时间:2018-03-01 10:13:14

标签: python class object module

在方法中使用__name__引用定义类的模块。

是否有办法让对象获取已实例化的模块?

1 个答案:

答案 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(),则返回相同的内容。