首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
宝塔
V2EX  ›  Python

关于__init__.py 的疑问

  •  
  •   304464743 · 121 天前 · 1646 次点击
    这是一个创建于 121 天前的主题,其中的信息可能已经有所发展或是发生改变。

    init.py 是在里面写__all__=[""]用来导入包的,函数或类写在同一个包的其他文件里。 但我看了 django 的源码,他有些包,会把一些函数或者类也写在__init__.py 所以我想问,把函数或者类写在__init__.py 有什么特殊含义或者用法么?

    18 回复  |  直到 2019-07-26 21:27:29 +08:00
        1
    Etuloser   121 天前
    你在导入这个模块的时候 实际是在导入 __init__.py 文件
        2
    HelloAmadeus   121 天前 via iPhone
    没有,而且不推荐这样做。和普通.py 文件的唯一区别就是导入路径
        3
    tabris17   121 天前
    没有特殊含义

    用 __all__ 导出仅仅是针对 from xxx import * 而已
        4
    dinjufen   121 天前
    一个文件夹包含__init__.py 就成了 Python 包,可以用 import、from... import ...导入
        5
    Vegetable   121 天前
    没什么特殊的含义。
    同样不建议在这里边写代码,不好组织代码。容易出现交叉引用的情况。
        6
    secsilm   121 天前
    __init__.py 在 python3 里已经不需要了
        7
    chaleaochexist   121 天前
    @secsilm 有说明链接吗?

    @lz
    就是为了在导入的时候省事儿.
        8
    hmxxmh   121 天前
    模块与包的区别,新建一个文件夹有 init 的就是包,你可以在新建的时候选择 package 看下
        9
    chaleaochexist   121 天前
    @secsilm 找到了谢谢.
        10
    secsilm   121 天前   ♥ 1
    @secsilm 严格来说是 Python 3.3 之后空的 __init__. py 不需要了。见 [PEP 420]( https://www.python.org/dev/peps/pep-0420/)
        11
    frostming   118 天前
    @secsilm 你可能理解错了 PEP 420
        12
    secsilm   118 天前
    @frostming 如何说?
        13
    frostming   118 天前
    @secsilm 整个 PEP 明明讨论的是 Namespace package,并不影响普通 package
        14
    secsilm   118 天前
    @frostming 我感觉我说的那句没问题,有了 namespace packages,空的 __init__.py 确实不需要了。但如果在某文件夹发现了 __init__py,仍然会当作是 regular package ( 3.2 及之前版本实现的 package )。
        15
    frostming   118 天前
    @secsilm Namespace package 是 python 包分发的概念,这个 package 是代码组织的概念,无论是不是 3.2 以后都是要__init__.py ,不然你都 import 不了
        16
    secsilm   118 天前 via Android
    @frostming 实际上是能 import 的,A 目录下有个 B.py ,在 A 同级目录下是能够 import A.B 的,我一直这么写的,Python3.6
        17
    frostming   117 天前
    @secsilm 不能,Python 3.7.4

    Traceback (most recent call last):
    File "c.py", line 1, in <module>
    import a.b
    ModuleNotFoundError: No module named 'a'
        18
    secsilm   117 天前
    @frostming 我这里可以,Python 3.6.8 和 3.7.3



    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3004 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 10:49 · PVG 18:49 · LAX 02:49 · JFK 05:49
    ♥ Do have faith in what you're doing.