python的 包与模块

模块:一个.py文件就是一个模块

:许多个模块放到同一个带有__init__.py文件的目录下,此目录就是包。注释1

 

示例:

package

  |----module1.py

  |----module2.py

  |...

 

关于导入存在的一个问题:如果导入的模块是一个类时,其代码回立即执行,而如果是方法或者函数时,会创建他们,但是其代码只有在调用时才执行

令在同一个包下面有两个文件:aboutMe.py 与 impack.py,而后者要从前者导入模块以使用其中的类:

示例1:

 1 #abouMe.py
 2 class MeMe:
 3     def __init__(self,name,age):
 4         self.name = name
 5         self.age = age
 6         print('wish good')
 7 
 8 pd = MeMe('pd',12)
 9 print(pd.name,pd.age)
10 
11 
12 #impack.py
13 import abouMe
14 输出:
15 wish good
16 pd 12
17 
18 可见,引入模块即是执行了模块的全部代码,这自然是不好的

 

示例2(采用函数包装来解决上面的问题):

 1 #aboutMe.py
 2 class MeMe:
 3     def __init__(self,name,age):
 4         self.name = name
 5         self.age = age
 6         print('wish good')
 7 
 8 def main():
 9     pd = MeMe('pd',12)
10     print(pd.name,pd.age)
11 
12 if __name__=='__main__':
13     main()
14 
15 
16 #impack.py
17 #版本1:
18 import abouMe
19 
20 此时什么都不会输出,也就解决了上面的问题,若想要输出就要调用main函数:
21 abouMe.main()
  输出:
22 wish good 23 pd 12 24 25 #版本2: 26 from abouMe import main #同理, 单独有这句也不会输出 27 print(main.__name__) 28 main() 29 输出: 30 main 31 wish good 32 pd 12

上面impack.py版本2中关于__name__ 需要注意的是:在将其作为模块导入时,其名字就是导入的本身,而以python 模块.py运行时__name__变成__main__,所以才有我们常见的if __name__=="__main__",而上例中的aboutMe.py的写法就很好的综合的两者。

 

注释1:

  在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。

posted @ 2016-04-28 20:31  billiepander  阅读(444)  评论(0)    收藏  举报