Python抽象基类

时间:2018-05-27 17:29:40

标签: python abstract-class abc

当我进一步深入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”被记录为具体的,所以我应该能够以某种方式使用它,这是我的问题。

1 个答案:

答案 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_packageSourceLoader提供默认实现它的子类不需要覆盖它以便是非抽象的。)

因此,你需要写:

is_package

其中from importlib.machinery import SourceFileLoader ... answer = SourceFileLoader(fullname, path).is_package(fullname) 是&#34;加载器要处理的模块的完全解析名称&#34;并且fullname是&#34;模块文件的路径。&#34;