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实现中工作。