zoukankan      html  css  js  c++  java
  • Python import 与 __all__

    import module

    使用from <module> import *导入模块时,若显式定义了__all__,则只导入__all__中的name,否则会导入除以下划线开头的所有name

    文件目录结构

    |---main.py
    |---module.py

    定义module文件:

    # __all__ in a module, means that when you import * from the module, only those names in the __all__ will imported
    __all__ = ['hello', 'Person', '__private']
    ​
    _internal = 'internal'__private = 'private'
    ​
    ​
    class Person():
        def __init__(self):
            print('init person')
    ​
    ​
    def hello():
        print('hello')
    ​
    ​
    def world():
        print('world')

    导入模块:

    import module
    ​
    module.Person()
    module.hello()
    # 可以访问以下划线开头的name
    print(module._internal)
    module.world()
    ​
    # ======================================
    from module import *
    ​
    Person()
    hello()
    print(__private)
    ​
    # NameError: name 'world' is not defined
    # world()
    # NameError: name '_internal' is not defined
    print(_internal)

    import package

    package中的__init__.py文件会影响到包文件的导入

    文件目录结构

    |---main.py
    |---packages
    |---__init__.py
    |---pkg.py

    __init__.py为空,main.py

    import packages.pkg as ppkg
    ​
    ppkg.Package()
    ppkg._internal
    ​
    # =============================================
    from packages import pkg
    ​
    pkg.Package()
    ​
    # =============================================
    # 不会导入任何name
    from packages import *

    __init__.py中指定模块name

    __init__.py

    __all__ = ['pkg']

    main.py

    import packages.pkg as ppkg
    ​
    ppkg.Package()
    ppkg._internal
    ​
    # =============================================
    from packages import *
    ​
    pkg.Package()
    pkg._internal

    __init__.py中导出模块中的部分名称

    __init__.py

    from pkg import *__all__ = ['Package', 'init']

    main.py

    import packages as pg
    ​
    pg.Package()
    ​
    # ============================================
    from packages import Package
    ​
    Package()
    ​
    # =============================================
    from packages import pkg
    ​
    # AttributeError: 'function' object has no attribute 'Package'
    # pkg.Package()
    # =============================================
    from packages import *
    ​
    Package()
    init()
    # name 'pkg' is not defined
    # pkg.Package()
    # pkg._internal

    对于package的导入,若__init__.py不为空,则只能导入__init__.py中指定的模块(中的)name;

    __init__.py为空时,通过from package import *无法导入任何name;

     

    推荐阅读

    Python Modules

    Python Package

    Python Namespace and Scope

    Can someone explain all in Python?

  • 相关阅读:
    svn command line tag
    MDbg.exe(.NET Framework 命令行调试程序)
    Microsoft Web Deployment Tool
    sql server CI
    VS 2010 One Click Deployment Issue “Application Validation did not succeed. Unable to continue”
    mshtml
    大厂程序员站错队被架空,只拿着五折工资!苟活和离职,如何选择?
    揭秘!Windows 为什么会蓝屏?微软程序员竟说是这个原因...
    喂!千万别忘了这个C语言知识!(~0 == -1 问题)
    Linux 比 Windows 更好,谁反对?我有13个赞成理由
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/13129991.html
Copyright © 2011-2022 走看看