python语法31[包模块实例]

例子1:

一 实例和结果

1) 实例的结构和具体的文件:
PyPackage
│  PyCommonM.py
│  __init__.py

├─p1Package
│      P1M.py
│      P1MC.py
│      __init__.py

└─p2
       P2.py
       P2M.py

2) PyCommonM.py
def PyCommonMF():  print "PyCommonMF"

3) P1M.py:
def P1MF():   print 'P1MF'

4) P1MC.py:
class P1MC(): 
  @staticmethod
  def P1MCF():  print 'P1MCF'

5)P2M.py:
def P2MF(): print 'P2MF'

6) P2.py:
import P2M
from PyPackage import PyCommonM
from PyPackage.p1Package import P1M
from PyPackage.p1Package.P1MC import P1MC

def P2F(): 
  print 'P2F'
  
if __name__ == '__main__':
  P2F()
  P2M.P2MF()
  P1M.P1MF()
  P1MC.P1MCF()
  PyCommonM.PyCommonMF()

7) 运行p2.py的结果:
P2F
P2MF
P1MF
P1MCF
PyCommonMF

 

二 解释

*  一个py文件为一个module,例如module: PyCommonM.py,P2M.py,P1MC.py, P1M.py 。

*  包含__init__.py的文件夹为一个package,例如package: PyPackage,p1Package。

*  可以直接使用import来引用相同目录下的其他的module, 例如p2.py中的import P2M。

*  通过from import来引用其他的目录下且属于某个package的module,例如py.py中的from PyPackage import PyCommonM 和 from PyPackage.p1Package import P1M。

*  通过from import来引用某个module中的类,例如from PyPackage.p1Package.P1MC import P1MC

 

注意package所在的目录必须在pythonpath环境变量中。 

 转载来源:http://www.cnblogs.com/itech/archive/2011/04/26/2029587.html


例子2:

package目录下有module1.py, module2.py, __init__.py

module1.py内容如下:

def func1():
    print("func1 function")

module2.py内容如下:

def func2(par):
    print ("func2 function")
    return

__init__.py内容如下:

from module1 import func1
from module2 import func2


与package文件夹在同一目录下的文件test.py,内容如下:

import package
package.func1()
package.func2('test func2')

输出结果如下:

func1 function
func2 function

注:要把package目录路径放置在PYTHONPATH环境变量中

参考:http://www.w3cschool.cc/python/python-modules.html


1 模块(Module)和包(Package)

1.1 命名空间(Namespace)

由于在Python中一切皆为对象(Object), 想要好好理解Module和Package,一定要先理解Namespace的概念。 所谓Namespace,是指标示符的可见范围。对于Python而言,常见的Namespace主要有以下几种:

  1. Build-in Namespace (内建命名空间)
  2. Global Namespace (全局命名空间)
  3. Local Namespace (局部命名空间)

有了命名空间的概念,可以有效的解决函数或者是变量重名的问题。不同的命名空间中允许出现相同的函数名或者 是变量名。它们彼此之间不会相互影响,例如在Namespace A和B中同时有一个名为var的变量,对A.var赋值并不 会改变B.var的值。

1.2 模块(Module)

Python中的一个Module对应的就是一个.py文件。其中定义的所有函数或者是变量都属于这个Module。这个Module 对于所有函数而言就相当于一个全局的命名空间。而每个函数又都有自己局部的命名空间。

# test.py 
'''
This is only a test module
'''
age = 0

def printHello():
  print "Hello, world!"

if __name__ == '__main__':
   printHello()


我们可这样来使用这个module, 用t来作为test的别名

import test as t
>>> t.age
0
>>> t.age = 1
1
>>> t.printHello()
Hello, world!
>>> print t.__doc__
This is only a test module


当然,我们也可以这样来使用:

>>> form test import *
>>> age
0
>>> printHello()

你一定有注意到'__main__'的条件判断,由于每一个module都有__name__的属性,只有当直接运行 这个module的时候,__name__属性才会等于__main__。当它被import的时候,你可以完全当它不存在。

1.3 包(Package)

所谓Package, 就是一堆module的集合,也就一堆.py文件。 你可以用如下方式来创建一个package

  1. 新建一个folder名为test
  2. 在test文件夹下新建一个空的__init__.py文件。
  3. 在test文件夹下新建下py文件,名为a.py
# a.py
def sayHello():
  print "Hello, world!"

>>> import test.a as t
>>> t.sayHello()
Hello, world!

Package 提供了一种很好的管理module的方式,可以有效的减少module的命名conflict,保持较好的树型结构。

转载来源:http://blog.csdn.net/huangkangying/article/details/32348665#t0


python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:
(1)主程序与模块程序在同一目录下:
如下面程序结构:
`-- src
    |-- mod1.py
    `-- test1.py
    若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *;


(2)主程序所在目录是模块所在目录的父(或祖辈)目录
如下面程序结构:
`-- src
    |-- mod1.py
    |-- mod2
    |   `-- mod2.py
    `-- test1.py
    若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.


(3)主程序导入上层目录中模块或其他目录(平级)下的模块
如下面程序结构:
`-- src
    |-- mod1.py
    |-- mod2
    |   `-- mod2.py
    |-- sub
    |   `-- test2.py
    `-- test1.py
    若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下:
   下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行python test2.py
而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。
   import sys
   sys.path.append("..")
   import mod1
   import mod2.mod2


 (4)从(3)可以看出,导入模块关键是能够根据sys.path环境变量的值,找到具体模块的路径。这里仅介绍上面三种简单情况。
来自:http://hi.chinaunix.net/?253639/viewspace-25422

展开阅读全文

没有更多推荐了,返回首页