zoukankan      html  css  js  c++  java
  • Python模块包中__init__.py文件的作用

    转载自:http://hi.baidu.com/tjuer/item/ba37ac4ce7482a0f6dc2f08b

    模块包:

    包通常总是一个目录,目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。差不多就像这样吧:

    Package1/ __init__.py
    Module1.py
    Module2.py
    Package2/ __init__.py
    Module1.py
    Module2.py

    我们可以就这样导入一个包:

    import Package1

    或者调入一个子模块和子包:

    from Package1 import Module1
    from Package1 import Package2
    import Packag1.Module1
    import Packag1.Package2

    可以深入好几层包结构:

    from Package1.Package2 import Module1
    import Package1.Package2.Module1

    大致就这样吧,我觉得,包的精髓应该是在 __init__.py 这个文件之中的。



    __init__.py 文件:

    __init__.py 控制着包的导入行为。假如 __init__.py 为空,那么仅仅导入包是什么都做不了的。

    >>> import Package1
    >>> Package1.Module1
    Traceback (most recent call last): File "<pyshell#1>", line 1, in ? Package1.Module1
    AttributeError: 'module' object has no attribute 'Module1'

    我们需要在 __init__.py 里把 Module1 预先导入:

    #文件 __init__.py
    import Module1

    测试:

    >>> import Package1
    >>> Package1.Module1
    <module 'Package1.Module1' from 'Module.pyc'>

    __init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:

    from PackageName import *

    这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:

    #文件 __init__.py
    __all__ = ['Module1', 'Module2', 'Package2']

    测试:

    >>> from Package1 import *
    >>> Module2
    <module 'Package1.Module2' from 'Module.pyc'>

    __init__.py 文件会在导入时被执行。

  • 相关阅读:
    vue 富文本编译器 vue-quill-editor
    vue-拖拽的使用awe-dnd
    Dapper是什么?
    如何运用领域驱动设计
    面试官问我MySQL索引,我
    MySQL:你知道什么是覆盖索引吗?
    mysql覆盖索引与回表
    C#.NET 字符串转数组,数组转字符串
    MYSQL如何让主键使用BTREE索引
    MySQL大表优化方案 Mysql的row_format(fixed与dynamic)
  • 原文地址:https://www.cnblogs.com/maseng/p/3580696.html
Copyright © 2011-2022 走看看