Python中的实例模块

Python中的实例模块,python,class,object,module,Python,Class,Object,Module,在方法中使用\uuuu name\uuuu会引用定义类的模块 是否有一种方法可以代替对象获取实例化模块?因此,Python的动态性允许函数检查调用它的帧对象 如果可以将模块显式地传递给类构造函数,则会更好,不过: class MyObject: def __init__(self, module): self.module = module ... 在其他文件中: m = MyObject(__name__) 但是,正如我在第一行中提到的,您可以

在方法中使用
\uuuu name\uuuu
会引用定义类的模块


是否有一种方法可以代替对象获取实例化模块?

因此,Python的动态性允许函数检查调用它的帧对象

如果可以将模块显式地传递给类构造函数,则会更好,不过:

class MyObject:
    def __init__(self, module):
         self.module = module
         ...
在其他文件中:

m  = MyObject(__name__)
但是,正如我在第一行中提到的,您可以访问代码调用 一个module-save如果你有一个专门的元类,那么调用一个类的
\uuuu init\uuuu
的代码就是实例化对象的地方。所以你可以写:

import inspect

class MyObject:
    def __init__(self, module):
         caller_frame = inspect.currentframe().f_back
         self.module = caller_frame.f_globals.get("__name__", "<unknown module>")
         ...
导入检查
类MyObject:
定义初始化(自身,模块):
调用方\u frame=inspect.currentframe().f\u back
self.module=caller\u frame.f\u globals.get(“\uuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
...

Frame对象是一个内部Python对象,它在程序运行时保持代码上下文的执行状态。它包含对该框架可用的全局变量和局部变量的引用,以及代码对象、当前源代码行等。最上面的帧(0)是正在执行的当前帧-最上面的第二帧(1)是当前函数/方法的直接调用方。frame
.f_globals
属性是对globals字典的直接引用-如果在该框架内调用
globals()
,将返回相同的引用。

您可以在对象的init内使用
\uu name\uuuu
来存储该确切信息,以备以后使用。您的目标是什么,您想实现什么?Python不跟踪实例实例化的位置。如果需要此类功能,则必须自己实现(例如,通过将模块传递给构造函数)。也就是说,我真的无法想象为什么有人需要这么做。对我来说,这听起来像是一种代码味道。它就是为了这个:一个为Python添加函数管道语法的库。因此,这是一个相当肮脏的元编程黑客,推动语言的设计目的。我有一个对象,它拾取函数的标识符并为它们创建对象包装器。此时,
\uuuuu name\uuuu
被传递给构造函数。但是如果没有必要,那就太好了。顺便说一句,如果您正在编写代码试图将函数性的东西传递到Python中,那么您真的应该熟悉Frame对象。请看更多的例子。最好在处理完frame对象变量后删除它,否则会删除它。最好避免使用sys.\u getframe,因为。您可以改用
inspect.currentframe().f_back
。Python中的所有对象都可以创建一个“引用循环”——如果您保留对它的引用的话。将
del
放在变量jsut上,因为它引用了一个框架,这与
del
放在任何其他变量上没有什么不同:通常是一个冗余语句。(除非您处理的是生成器或异步函数中的帧对象)啊,这一切似乎都正常。非常感谢。我以前曾尝试在框架上使用
inspect
,但显然是做错了什么。有一些项目经常使用元编程。只需包含一些严肃的单元测试,以便提前知道它是否在特定的Python实现中工作。