Python 的 __loader__ 是什么?

24 投票
1 回答
16999 浏览
提问于 2025-04-17 20:52

我在一些Python文件中看到过__loader__这个词,但除了几条简短的描述外,我找不到相关的文档,这些描述也没能让我真正理解它。我只知道它和导入模块有关,除此之外我完全不明白。它到底是干什么的?什么时候会用到?如果可以的话,我该怎么使用它呢?

1 个回答

21

什么是 __loader__

__loader__ 是一个属性,它在导入的模块上由加载器设置。访问这个属性时,会返回加载器对象本身。

在 Python 3.3 之前的版本中,内置的导入机制并不会设置 __loader__。这个属性只在使用自定义加载器导入的模块上可用。

不过,在 Python 3.3 中,这个功能发生了变化,原因是 PEP 0302。现在,__loader__ 在每个被导入的模块上都可以使用:

>>> # Python 3.3 interpreter
>>> import os
>>> os.__loader__
<_frozen_importlib.SourceFileLoader object at 0x01F86370>
>>>

什么是加载器?

加载器是一个由查找器返回的对象。它使用 load_module() 方法将模块加载到内存中。importlib.abc.Loader 是一个加载器的抽象基类的例子。


什么是查找器?

查找器是一个对象,它使用 find_module() 方法来尝试找到一个模块的加载器。importlib.abc.Finder 是一个查找器的抽象基类的例子。不过需要注意的是,它已经被弃用,取而代之的是 importlib.abc.MetaPathFinderimportlib.abc.PathEntryFinder


我该如何使用它,如果可以的话?

__loader__ 的主要用途是用于自省(也就是查看对象的属性和方法)。不过,还有两个常见的用法:

  1. __loader__ 可以用来收集特定模块的加载器的数据。

  2. 在 Python 3.3 之前的版本中,__loader__ 可以与 hasattr 一起使用,检查一个模块是否是通过内置的导入机制导入的:

    >>> # Python 3.2 interpreter
    >>> import os
    >>> hasattr(os, '__loader__')
    False
    >>>
    

    如果 hasattr(os, '__loader__') 返回 True,这意味着 os 模块是通过自定义加载器导入的。因为它没有返回 True,所以说明这个模块是通过内置的导入机制导入的。

    注意: 上面的测试在 Python 3.3 及以上版本中将不再有效,因为 PEP 0302 的变化。

撰写回答