`
arganzheng
  • 浏览: 103500 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

python学习笔记之module && package

阅读更多


python学习笔记之module && package

python的module

  1. import只能导入模块,不能导入模块中的对象(类、函数、变量等)。如一个模块A(A.py)中有个函数getName,另一个模块不能通过import A.getName将getName导入到本模块,只能用import A。如果想只导入特定的类、函数、变量则用from A import getName即可。
  2. import一个module时,会执行该module的所有方法,并且将该module添加到importing module的命名空间中。A module's body executes immediately the first time the module is imported in a given run of a program...An import statement creates a new namespace containing all the attributes of the module. 如:
  3. fibo.py
    # Fibonacci numbers module
    
    def fib(n):    # write Fibonacci series up to n
        a, b = 0, 1
        while b < n:
            print b,
            a, b = b, a+b
    
    def fib2(n): # return Fibonacci series up to n
        result = []
        a, b = 0, 1
        while b < n:
            result.append(b)
            a, b = b, a+b
        return result
    
    print "EOF"
    In [1]: import fibo
    EOF
    
    In [2]: import fibo
    
    In [3]: fibo.
    fibo.__builtins__      fibo.__doc__           fibo.__hash__          fibo.__package__       fibo.__setattr__       fibo.fib               
    fibo.__class__         fibo.__file__          fibo.__init__          fibo.__reduce__        fibo.__sizeof__        fibo.fib2              
    fibo.__delattr__       fibo.__format__        fibo.__name__          fibo.__reduce_ex__     fibo.__str__           fibo.py                
    fibo.__dict__          fibo.__getattribute__  fibo.__new__           fibo.__repr__          fibo.__subclasshook__  fibo.pyc               
    
    In [3]: fibo.__name__
    Out[3]: 'fibo'
    
    In [4]: fibo.fib(100)
    1 1 2 3 5 8 13 21 34 55 89
    
    In [5]: fibo.fib2(100)
    Out[5]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    
    In [6]: from fibo import fib
    
    In [7]: fib(100)
    1 1 2 3 5 8 13 21 34 55 89
    
    In [8]: fib2(100)
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    
    /home/forrest/study/python/<ipython console> in <module>()
    
    NameError: name 'fib2' is not defined
    
    In [9]: from fibo import *
    
    In [10]: fib2(100)
    Out[10]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

    会将fibo添加在当前module的名字空间,并且执行fibo.py定义的函数(定义函数表示将函数名添加到module的命名空间)这样就可以通过fibo访问fibo中定义的方法。并且会执行module中的statement。上面只执行一次,说明python只加载了一次。

     

    下面这段话道出了python module的本质,其实也是整个python语言的本质——邦定。1. 变量定义:赋值邦定,对一个x = y==>定义一个变量x,他的值是y,并且将这个变量邦定在其命名空间上(如果是全局变量,那么是该变量所在module)。如果是函数内部变量,运行时才会执行,并且是邦定在函数对象上。2. 函数定义:def functionName: 定义一个函数对象,并将其邦定在所在命名空间中。 3. 类定义:class clsName: 定义一个类,并将该类对象邦定在其命名空间中。

     

    Attributes of a module object are normally bound by statements in the module body. When a statement in the body binds a variable (a global variable), what gets bound is an attribute of the module object. The normal purpose of a module body is exactly that of creating the module's attributes: def statements create and bind functions, class statements create and bind classes, and assignment statements can bind attributes of any type. 

    You can also bind and unbind module attributes outside the body (i.e., in other modules), generally using attribute reference syntax M.name (where M is any expression whose value is the module, and identifier name is the attribute name). For clarity, however, it's usually best to limit yourself to binding module attributes in the module's own body. 


     

python的package

包通常总是一个目录,目录下为首的一个文件便是 _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文件

The _init.py files are required to make Python treat the directories as containing packages. In the simplest case, __init.py can just be an empty file, but it can also execute initialization code for the package or set the __all_ variable, described later.

_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 预先导入:

import Module1

测试:

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

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

from PackageName import *

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

__all__ = ['Module1', 'Module2', 'Package2']

测试:

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

_init_.py其实就是一个普通的python文件,它会在package被导入时执行。

print ">>>in package1.__init__.py"

def say_hello():
    print "Hi, my name is Forrest!"

测试:

In [1]: import package1
>>>in package1.__init__.py

In [2]: package1.say_hello()
Hi, my name is Forrest!
多级package——_init_.py依次被执行
In [1]: import package1.package2
<<<in package1.__init__.py>>>
<<<in package1.package2.__init__.py>>>

In [2]: package1.say_hello()
Hi, my name is Forrest!

In [3]: package2.foo_bar()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/forrest/study/python/<ipython console> in <module>()

NameError: name 'package2' is not defined

In [4]: package1.package2.foo_bar()
foobar!

注意到多级package的import,虽然该路径上的所有packages都被引入了,但是使用的时候仍然必须使用完整路径。
将package/_init_.py改成如下:

print "<<<in package1.__init__.py>>>"

import package2

def say_hello():
    print "Hi, my name is Forrest!"
In [1]: import package1
<<<in package1.__init__.py>>>
<<<in package1.package2.__init__.py>>>

In [2]: package1.package2.foo_bar()
foobar!

In [3]: package2.foo_bar()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/forrest/study/python/<ipython console> in <module>()

NameError: name 'package2' is not defined

可以看到也是一样的,必须全路经引用。这是因为在哪个module中import的module,是加入到importing module的名字空间,所以只有该imoprting module可以短路引用,其他的间接引用必须通过import module一路引用过去。



补记:关于Python的module
2011-04-03 星期天 阴雨 

python的module特别像C++中的命名空间(namespacce),因此也就特别像java中的package。
例如,如果你定义了一个namespace mynamespace,那么你可以如下处理:

1> using namespace mynamespace;然后你就可以使用使用mynamespace中的每一个成员。类似与python中的from mynamespace import *

2> using mynamespace::aFunc;在这个文件中可以并且只能使用mynamespace中的aFunc这个定义,直接aFunc()就可以了。类似于python中的from mynamespace import aFunc。

3> 你也可以在使用时直接使用mynamespace::aFunc();来调用mynamespace中的任何成员定义。 在C++中你需要

但是python跟C++有个非常大的不同是,它的import不仅仅是引入命名空间,还引入了python文件(这点类似于C的#import头文件),就是说它的import语法共用了(呃,你可以说它责职不单一)。事实上,python的import一定是引入一个module,也就是一个python文件,如果你想要只引入该module的某个部分,那么可以使用from mudule import xxx。而C++中,你要引入一个namespace中的某一个定义,你必须用两个语句:

首先,引入该定义的头文件:

#include "xxx.h"

然后,引入该头文件的某个命名空间:

#using namespace xxx或者using xxx::yyy

所以,其实python的module,更像是java的package,但是又不像java的package一定是目录,python的module一般是python文件。

其实,作这种对比,目的在于说明,任何语言原理都是差不多的,不需要太纠结于语法细节。应该关注更本质的东西——算法与数据结构。这才是王道



分享到:
评论
2 楼 kuchaguangjie 2012-10-10  
great, thanks!!!
1 楼 newlifewant 2012-08-27  
   nice article! thanks for sharing!

相关推荐

    Python学习笔记.zip

    总之,“Python学习笔记”这个压缩包将引导你走过Python学习的各个阶段,从基础到进阶,从理论到实践,帮助你在编程之路上不断成长。通过深入学习和实践,你可以掌握Python这一强大的工具,开启无限可能的编程之旅。

    python基础笔记html.rar

    "python基础笔记html"这个压缩包文件显然是一个关于Python基础知识的学习资料,包含了HTML格式的笔记,可能涵盖了变量、数据类型、控制结构、函数、模块等核心概念。 1. **Python简介**:Python是由Guido van ...

    Python学习笔记

    从给定的文件信息来看,这是一份详细的Python学习笔记,涵盖了从基础语法到高级特性,包括数据类型、控制结构、函数、模块、类与对象、异常处理等多个方面。下面,我们将对这份学习笔记中的一些关键知识点进行深入...

    Python基础学习笔记

    ### Python基础学习笔记知识点概述 #### 一、Python的应用领域及流行原因 - **云计算:** 如微软的Windows Azure中大量使用Python进行开发。 - **大型企业应用:** Google使用Python实现Web爬虫和搜索引擎组件;Yahoo...

    python学习笔记

    根据提供的文档信息,可以看出这是一份非常详细的Python学习笔记,涉及了Python编程语言的基础概念、数据类型、控制结构、函数、模块与包管理、面向对象编程等多方面的内容。下面将对这些知识点进行详细的总结与解释...

    python核心笔记_python核心笔记_

    模块(module)是包含Python定义和语句的文件,包(package)则是一种层次化的命名空间,用于管理大型项目。 6. **异常处理**:Python通过try/except/finally语句处理程序运行时可能发生的错误,提高程序健壮性。...

    Python 学习笔记

    ### Python学习笔记 #### 1. Python 基础语法 ##### §1.1 Python简介 - **Python** 是一种解释型、面向对象的高级编程语言。 - 特点包括代码简洁易读、强大的标准库支持等。 - 广泛应用于Web开发、数据科学、自动...

    python学习个人笔记.docx

    ### Python学习个人笔记知识点概述 #### 一、Python生成EXE文件 在Windows平台上,将Python脚本打包成EXE文件是一种常见的需求,这有助于在没有安装Python的计算机上运行程序。以下是具体步骤: 1. **环境准备**...

    python入门课程笔记

    Python是一种广泛使用的高级编程语言,以其易读性、简洁的语法和强大的功能而闻名。作为初学者,Python是进入编程...通过学习这些内容,你将能够编写出有效的Python程序,并为进一步深入学习和应用Python打下坚实基础。

    python笔记.zip

    在Python学习的初始阶段,你会接触到基本的编程概念,如变量、常量、注释和数据类型。Python支持多种数据类型,包括整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。此外,Python是动态类型的,这...

    pythonx学习指南

    从给定的文件信息来看,这是一份详细的Python学习指南,涵盖了从基础语法到高级特性的一系列主题。以下是对这份指南中的主要知识点的详细解读: ### Python基础语法 #### §1.1 Python简介 这部分提供了Python...

    python十天笔记1

    最后,我们了解了模块和包的管理,包括`python_module.ipynb`中的模块导入机制,`python_package.ipynb`中的包创建,以及`python_release_by_distutils.ipynb`中的程序打包发布。错误处理是编程中不可或缺的一部分,...

    记录python学习用.zip

    这个压缩包“记录python学习用.zip”似乎包含了某位学习者在Python编程过程中的学习资料或者笔记,可能包括代码示例、练习项目或者学习心得。 首先,Python的基础知识是学习的起点。它使用缩进来表示代码块,遵循...

    Python第一阶段笔记汇总.docx

    10. **面向对象(Object Oriented)**:面向对象编程是Python的主要编程范式之一。它包含类和对象的概念,以及封装、继承和多态三大特性。封装用于隐藏实现细节,继承实现代码复用,多态允许子类对象替换父类对象。 ...

    恩培-计算机视觉-学习笔记-P2-行走的小部落

    在学习过程中,了解Python的基础知识是第一步,这包括如何运行Python代码、基本的语法规则以及常用的数据结构。 1. **Python代码运行方法** Python作为脚本语言,可以使用解释器直接运行,不依赖于IDE。推荐使用...

    《python开发技术详解》笔记1

    分层命名,例如`my_package.module_name`,它帮助管理大型项目,提供命名空间隔离。 - 模块:模块是包含Python定义和语句的文件,可以导入到其他程序中使用,通过`import`关键字实现。 - 模块的属性:模块拥有属性,...

Global site tag (gtag.js) - Google Analytics