当我进一步深入Python内部时,我开始在文档中更频繁地看到abc。不幸的是,文档没有解释如何使用它们。我甚至无法使用这些抽象基类的“具体实现”。
例如,阅读类importlib.abc.SourceLoader,得知“is_package”是InspectLoader.is_package()的具体实现。但是如果我想在我的代码中使用它呢?可能吗?我尝试了很多方法,但无法导入该方法。
ExtensionFileLoader被记录为importlib.abc.ExecutionLoader的具体实现,但如果我尝试使用它(例如:from importlib import machinery.ExecutionLoader),则再次找不到它。
如果无法导入这些方法,为什么会记录这些方法?是否有任何示例代码来说明如何使用它们?示例:
import importlib.abc.SourceLoader # doesn't work
class try_pkg_check():
def main(self, source_file_name):
possible_pkgs = ['math', 'numpy']
for posbl_pkg in possible_pkgs:
answer = SourceLoader.is_package(posbl_pkg)
print("For {}, the answer is: {}".format(posbl_pkg, answer))
return None
if __name__ == "__main__":
instantiated_obj = try_pkg_check()
instantiated_obj.main()
人们可能会评论我不应该尝试导入抽象类。但是“is_package”被记录为具体的,所以我应该能够以某种方式使用它,这是我的问题。
答案 0 :(得分:0)
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript">
function usersEmail() {
document.write("TEST");
}
</script>
</head>
<body>
<script type="text/javascript">
usersEmail();
</script>
</body>
</html>
此行生成的错误消息应该会提示您出错的提示:
import importlib.abc.SourceLoader
&#34; ModuleNotFoundError: No module named 'importlib.abc.SourceLoader'; 'importlib.abc' is not a package
&#34;要求import foo
是模块,但foo
是模块内的类。你需要写一下:
SourceLoader
然而,这一行还有其他问题:
from importlib.abc import SourceLoader
首先,SourceLoader.is_package
是一个实例方法,而不是类或静态方法;它必须在answer = SourceLoader.is_package(posbl_pkg)
的实例上调用,而不是在类本身上调用。但是,SourceLoader
是一个抽象类,因此无法直接实例化;你需要使用像SourceFileLoader
这样的具体子类。 (当文档调用SourceLoader
&#34; SourceLoader.is_package
的具体实现时,我相信他们的意思是InspectLoader.is_package
为SourceLoader
提供默认实现它的子类不需要覆盖它以便是非抽象的。)
因此,你需要写:
is_package
其中from importlib.machinery import SourceFileLoader
...
answer = SourceFileLoader(fullname, path).is_package(fullname)
是&#34;加载器要处理的模块的完全解析名称&#34;并且fullname
是&#34;模块文件的路径。&#34;