GVKun编程网logo

Python:如何从__init__.py文件导入?(python 导入py文件)

12

本文的目的是介绍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文件)

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文件的作用

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 文件使用

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文件的作用

我们经常在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__

python __new__ 和 __init__

概述

newinit 是类实例化的过程中被调用的方法, 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__的相关知识,请在本站进行查询。

本文标签: