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?

  • 相关阅读:
    tab
    js大牛
    Codeforces 559B Equivalent Strings 等价串
    Java (JDK7)中的String常量和String.intern的实现
    js控制textarea输入字符串的个数,鼠标按下抬起推断输入字符数
    用LogParser分析Windows日志
    oracle 11g RAC手动卸载grid,no deinstall
    硬件的魅力
    精益敏捷外包开发--- 思维篇
    MFC中CFileDialog使用方法
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/13129991.html
Copyright © 2011-2022 走看看