本文的目的是介绍Python:如何从__init__.py文件导入?的详细情况,特别关注python导入py文件的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Pyt
本文的目的是介绍Python:如何从__init__.py文件导入?的详细情况,特别关注python 导入py文件的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Python:如何从__init__.py文件导入?的机会,同时也不会遗漏关于18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用、Python __init__.py 文件使用、Python __init__.py文件的作用、python __new__ 和 __init__的知识。
本文目录一览:- Python:如何从__init__.py文件导入?(python 导入py文件)
- 18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用
- Python __init__.py 文件使用
- Python __init__.py文件的作用
- python __new__ 和 __init__
Python:如何从__init__.py文件导入?(python 导入py文件)
我正在使用Flask
Framework构建网站,其中有一个文件夹,其中有一些python文件和__init__.py
脚本(我想您将此文件夹称为模块吗?)。在
init .py文件中,我有一行话:
db = Database(app)
我现在想db
在此文件夹中的其他脚本中使用。通常,我会使用进行此操作from __init__ import
db
,但这样做似乎不合适,更不用说pythonic了。此外,由于它在__init__.py
文件中,因此我认为应该以某种方式对整个文件夹/模块进行初始化。
有人知道如何使用db
该__init__.py
文件吗?欢迎所有提示!
18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用
原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从 xml导入 dom )的时候,实际上导入了它的 __init__.py 文件。
一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
__init__.py 控制着包的导入行为。假如 __init__.py 为空,那么仅仅导入包是什么都做不了的。
Python __init__.py 文件使用
__init__.py的主要作用是:
1. Python中package的标识,不能删除
2. 定义__all__用来模糊导入
3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)
__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。
通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
# package
# __init__.py
import re
import urllib
import sys
import os
# a.py
import package
print(package.re, package.urllib, package.sys, package.os)
注意这里访问__init__.py文件中的引用文件,需要加上包名。
__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。
# __init__.py
__all__ = [''os'', ''sys'', ''re'', ''urllib'']
# a.py
from package import *
这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。
可以了解到,__init__.py主要控制包的导入行为。要想清楚理解__init__.py文件的作用,还需要详细了解一下import语句引用机制:
导入包
多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:
package
|- subpackage1
|- __init__.py
|- a.py
|- subpackage2
|- __init__.py
|- b.py
有以下几种导入方式:
import subpackage1.a # 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
from subpackage1 import a # 将模块a导入全局命名空间,例如访问a中属性时用a.attr_a
from subpackage.a import attr_a # 将模块a的属性直接导入到命名空间中,例如访问a中属性时直接用attr_a
使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。
应用举例:
程序结构:
-project
-data
-src
-filterCorpus.py
-translateMonolingual.py
问题描述:在translateMonolingual.py中引用filterCorpus.py中的函数fun1
from src import filterCorpus
filterCorpus.fun1()
即使translateMonolingual.py和filterCorpus.py在同一文件夹下,若translateMonolingual.py中直接引用import filterCorpus
会出错
。这是因为python3需要绝对路径引用,从project的根位置开始指明被引模块的位置。通用格式为:from directory import module
。如果module存在于directory1下的directory2,那么建议写成from directory1.directory2 import module
为什么需要__init__.py
__init__.py文件用于组织包(package)。这里首先需要明确包(package)的概念。什么是包(package)?简单来说,包是含有python模块的文件夹。一个python模块(module)为一个py文件,里面写有函数和类。包(package)是为了更好的管理模块(module),相当于多个模块的父节点。
当文件夹下有__init__.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。这些module都可以通过同一个package引入代码中。
__init__.py文件怎么写
可以什么都不写,但如果想使用from package1 import *
这种写法的话,需要在__init__.py中加上:
__all__ = [''file1'',''file2''] #package1下有file1.py,file2.py
python中__init__.py文件的作用实例
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。
那么,__init__.py还有什么别的功能呢?
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
我们可以再__init__.py文件中再导入其他的包,或者模块。
[python]
import readers
import writers
import commands
import users
import meta
import auth
import admin
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。
不需要一个个去导入module了。
__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
from PackageName import *
这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:
#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
Python __init__.py文件的作用
我们经常在python的模块目录中会看到 "__init__.py" 这个文件,那么它到底有什么作用呢?
1. 模块包(module package)标识
如果你是使用python的相关IDE来进行开发,那么如果目录中存在该文件,该目录就会被识别为 module package 。
2. 控制导包范围
假设我们的模块包的目录结构如下:

.
└── mypackage
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py

如果我们使用最直接的导入方式,将整个文件拷贝到工程目录下,然后直接导入:

from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32

当然这个例子里面文件比较少,如果模块比较大,目录比较深的话,可能自己都记不清该如何导入。(很有可能,哪怕只想导入一个模块都要在目录中找很久)
这种情况下,__init__.py 就很有作用了。我们先来看看该文件是如何工作的。
2.1 __init__.py 是怎么工作的?
实际上,如果目录中包含了 __init__.py 时,当用 import 导入该目录时,会执行 __init__.py 里面的代码。
我们在mypackage目录下增加一个 __init__.py 文件来做一个实验:

.
└── mypackage
├── __init__.py
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py

mypackage/__init__.py 里面加一个print,如果执行了该文件就会输出:
print("You have imported mypackage")
下面直接用交互模式进行 import
>>> import mypackage
You have imported mypackage
很显然,__init__.py 在包被导入时会被执行。
2.2 控制模块导入
我们再做一个实验,在 mypackage/__init__.py 添加以下语句:
from subpackage_1 import test11
我们导入 mypackage 试试:

>>> import mypackage
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/taopeng/Workspace/Test/mypackage/__init__.py", line 2, in <module>
from subpackage_1 import test11
ImportError: No module named ''subpackage_1''

报错了。。。怎么回事?
原来,在我们执行import时,当前目录是不会变的(就算是执行子目录的文件),还是需要完整的包名。
from mypackage.subpackage_1 import test11
综上,我们可以在__init__.py 指定默认需要导入的模块
2.3 偷懒的导入方法
有时候我们在做导入时会偷懒,将包中的所有内容导入
from mypackage import *
这是怎么实现的呢? __all__ 变量就是干这个工作的。
__all__ 关联了一个模块列表,当执行 from xx import * 时,就会导入列表中的模块。我们将 __init__.py 修改为 。
__all__ = [''subpackage_1'', ''subpackage_2'']
这里没有包含 subpackage_3,是为了证明 __all__ 起作用了,而不是导入了所有子目录。

>>> from mypackage import *
>>> dir()
[''__builtins__'', ''__doc__'', ''__loader__'', ''__name__'', ''__package__'', ''__spec__'', ''subpackage_1'', ''subpackage_2'']
>>>
>>> dir(subpackage_1)
[''__doc__'', ''__loader__'', ''__name__'', ''__package__'', ''__path__'', ''__spec__'']

子目录的中的模块没有导入!!!
该例子中的导入等价于
from mypackage import subpackage_1, subpackage_2
因此,导入操作会继续查找 subpackage_1 和 subpackage_2 中的 __init__.py 并执行。(但是此时不会执行 import *)
我们在 subpackage_1 下添加 __init__.py 文件:
__all__ = [''test11'', ''test12'']
# 默认只导入test11
from mypackage.subpackage_1 import test11
再来导入试试

>>> from mypackage import *
>>> dir()
[''__builtins__'', ''__doc__'', ''__loader__'', ''__name__'', ''__package__'', ''__spec__'', ''subpackage_1'', ''subpackage_2'']
>>>
>>> dir(subpackage_1)
[''__all__'', ''__builtins__'', ''__cached__'', ''__doc__'', ''__file__'', ''__loader__'', ''__name__'', ''__package__'', ''__path__'', ''__spec__'', ''test11'']

如果想要导入子包的所有模块,则需要更精确指定。
>>> from mypackage.subpackage_1 import *
>>> dir()
[''__builtins__'', ''__doc__'', ''__loader__'', ''__name__'', ''__package__'', ''__spec__'', ''test11'', ''test12'']
3. 配置模块的初始化操作
在了解了 __init__.py 的工作原理后,应该能理解该文件就是一个正常的python代码文件。
因此可以将初始化代码放入该文件中。
至此。转载请注明出处。
python __new__ 和 __init__
概述
new 和 init 是类实例化的过程中被调用的方法, new 负责对象的创建,相当于构造器或者构造函数; init 负责对象初始化。 使用频率上, init 较多会被使用。
class A(object):
def __new__(cls):
return object.__new__(cls)
def __init__(self):
self.instance_method()
def instance_method(self):
print ''success!''
newA = A()
区别
参数
new 的第一个参数是 cls,表示类本身。
而 init 类似一般的实例方法, 第一个参数是 self,表示实例。我们可以看到 init 方法运行之前, 实例已经可以被使用了(self参数)。实例上的其他的方法也是可以使用的了。
调用时机
当我们创建类的对象时, new 先被调用,返回一个对象,对象引用作为参数传递给 init__, 然后对象属性被初始化。__init 方法不能返回任何数据。
__new__ --->(创建对象) --> __init__(self)
使用
只有很少的时候需要自己编写 new 方法,比如单例模式。大多数情况下,只需要关心实例的初始化,初始化过程中属性的分配,以及是否调用其他的实例方法。
以上代码和经验仅在 Python(2.7) 得到验证。
今天的关于Python:如何从__init__.py文件导入?和python 导入py文件的分享已经结束,谢谢您的关注,如果想了解更多关于18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用、Python __init__.py 文件使用、Python __init__.py文件的作用、python __new__ 和 __init__的相关知识,请在本站进行查询。
本文标签: