python3 module中__init__.py的需要注意的地方

网上关于__init__.py的作用的资料到处都是,我在此就不再啰嗦哪些了。

若有需要、请各位看官去搜搜即可。

最近刚开始用Python3 就遇到了这个比较有意思的事情

闲言少叙,下面要介绍的是python3中__init__.py中的一些略微不同的地方

目录结构如下:

├── mdl
│   ├── __init__.py
│   ├── bar.py
│   └── foo.py
└── test.py

文件内容,从上至下,依次为

mdl/__init__.py:

#encoding:utf-8

from .foo import Foo    #python2、3都适用
from .bar import Bar    #python2、3都适用
#from mdl.foo import Foo    #python2、3都适用
#from mdl.bar import Bar    #python2、3都适用
#from foo import Foo    #python3不适用
#from bar import Bar    #python3不适用

mdl/bar.py:

class Bar():
    def __init__(self):
        pass

mdl/foo.py

class Foo():
    def __init__(self):
        pass

test.py

from mdl.foo import Foo
from mdl.bar import Bar
f = Foo()
b = Bar()

大家看到的贴的代码,可能就知道我所要说的是什么意思了吧……

对,没错。

之前在我们使用python2的时候(至少从python2.6之后是这样),我们通常将__init__.py置空(PS:置空的话,与python3也可以通用)或者直接(如下图所示)

from foo import Foo
from bar import Bar

然后可以正常地愉快地使用python test.py,没有任何报错信息。

但是在python3的时候(至少从python3.4之后是这样),我们这么来做

from foo import Foo
from bar import Bar

运行python test.py发现出错了,囧……

ImportError: No module named ‘foo‘

别的我也不多说了,我想大家也都看明白了

建议,大家之后都使用这种方式(通用用法)

from .foo import Foo
from .bar import Bar

【附录】

1、在python2来运行程序(即python test.py)之后,发现

├── mdl
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── bar.py
│   ├── bar.pyc
│   ├── foo.py
│   └── foo.pyc
└── test.py

(对,我们很常见的.pyc出现了)

2、在python3来运行程序之后,发现

├── mdl
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-34.pyc
│   │   ├── bar.cpython-34.pyc
│   │   └── foo.cpython-34.pyc
│   ├── bar.py
│   └── foo.py
└── test.py

(看到了不同了吧……)

时间: 2024-12-18 02:29:11

python3 module中__init__.py的需要注意的地方的相关文章

Python包中 __init__.py文件的作用

原创连接 https://www.cnblogs.com/AlwinXu/p/5598543.html Python包中 __init__.py文件的作用 在创建python包的过程中,IDE都会在包根目录下创建一个__init__.py文件,该Python文件默认是空的.目录结构如下: Pycharm下的package树结构: 在Finder中的目录结构: 从Finder中的目录就可以看出来,每个package实际上是一个目录(Directory),那么IDE是怎么识别它为package呢?没

Python模块包中__init__.py文件的作用

在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么,因为没有什么东西可写在这里,所以我直接把这个文件给删掉了,结果我的包图标自动变为文件夹图标了,这是怎么回事呢! 原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __ini

Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么,因为没有什么东西可写在这里,所以我直接把这个文件给删掉了,结果我的包图标自动变为文件夹图标了,这是怎么回事呢! 原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __ini

python中 __init__.py的作用

__init__.py一般是为空,用在一个python目录中,标识该目录是一个python的模块包 先上来看一个例子: 1 .: 2 test1 test2 test_init.py 3 4 ./test1: 5 time.py 6 7 ./test2: 8 cpuinfo.py cpuinfo.pyc __init__.py __init__.pyc test_init.py里面的代码如下: 1 from test2 import cpuinfo 2 from test1 import tim

Python包中__init__.py作用

在创建python包的过程中,IDE都会在包根目录下创建一个__init__.py文件,该Python文件默认是空的.目录结构如下: Pycharm下的package树结构: 在Finder中的目录结构: 从Finder中的目录就可以看出来,每个package实际上是一个目录(Directory),那么IDE是怎么识别它为package呢?没错,__init__.py的第一个作用就是package的标识,如果没有该文件,该目录就不会认为是package. Python中的包和模块有两种导入方式:

python包中__init__.py的作用

1.__init__.py定义包的属性和方法 一般为空文件,但是必须存在,没有__init__.py表明他所在的目录只是目录不是包 2.导入包的时候使用 例如有一个test目录,test下有xx1.py,xx2.py,__init__.py三个文件 | test | | __init__.py | | xx1.py | | xx2.py 则test可以当作包被导入,导入test下所有的文件 from test import * 导入的实际是__init__.py中变量__all__,即__all

Python中__init__.py文件作用之我见

在Python中每次创建一个package后都会自动生成一个 __init__.py'空文件;该问价的作用是:声明我们当前创建的文件夹(包)是一个**Python模块**,在Python中每一个包中必须有一个__init__ .py文件. 一般这个文件都为空,只有我们在这个包下面创建多个.py文件后,当我们想使用该包下的某一模块,我们则需要在__init__.py文件中通过 __ all__ = [ '模块名'] 指定我们需要导入的模块, Python中导包其实就是导入指定包文件中的__init

Python中__init__.py文件的作用详解

转自http://www.jb51.net/article/92863.htm http://www.jb51.net/article/86580.htm 网址包含更多关于Python相关内容感兴趣的读者可查看本站专题:<Python图片操作技巧总结>.<Python数据结构与算法教程>.<Python Socket编程技巧总结>.<Python函数使用技巧总结>.<Python字符串操作技巧汇总>.<Python入门与进阶经典教程>

python中一切皆对象及__init__.py文件的使用

py一切皆对象,数据.函数.后续声明的类也是一个对象,而函数名称就是对象名称 函数名可直直接返回,这种叫做闭包 python中__init__.py文件的作用,__all__属性配置加载的白名单 原文地址:https://www.cnblogs.com/liuchunxiao83/p/12307626.html