一.Python模块

Python模块(module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句.

  模块让你能够有逻辑的组织你的Python代码段

  把相关的代码分配到一个模块里能让你的代码更好用,更易懂

  模块能定义函数,类和变量,模块里也能包含可执行代码

1.1 import语句

一个模块只会被导入一次,不管你执行多少次import。这样可以防止导入模块被一遍又一遍的执行

  1. #demo.py
  2. import my_moudle #只在第一次导入时才执行my_moudle.py内代码,此处的显式效果是只打印一次'from the my_moudle.py'
                ,当然其他的顶级代码也都被执行了,只不过没有显示效果.
  3. import my_moudle
  4. import my_moudle
  5. import my_moudle
  6.  
  7. '''
  8. 执行结果:
  9. from the my_moudle.py
  10. '''
  11.  
  12. demo.py

1.2 首次导入模块my_moudle时会做三件事

  1.为源文件(my_moudle)创建新的名称空间,在my_moudle中定义的函数和方法若是使用了global访问的就是这个名称空间

  2.在新创建的命名空间执行模块中包含的代码,见初始导入import my_moudle

1.3 from....import语句

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

  1. from modname import name1[, name2[, ... nameN]]

例如,要导入模块 fib 的 fibonacci 函数,使用如下语句:

  1. from fib import fibonacci

这个声明不会吧整个fib模块导入到当前命名空间中,它只会将fib里的fibonacci 单个引入到执行这个声明的模块的全局符号表

1.4 from......import*  语句

把一个模块的所有内容全部导入到当前的命名空间也是可行的,值需要使用如下声明:

  1. from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多的使用。

例如我们想一次性的引入math模块中的所有东西,语句如下:

  1. from math import *

1.5 dir() 函数

dir() 函数一个排好序的字符串列表,内容是一个模块定义过的名字。

返回列表容纳在一个模块里定义的所有模块,变量和函数。eg:

  1. # 导入内置math模块
  2. import math
  3.  
  4. content = dir(math)
  5.  
  6. print content;

以上实例输出结果:

  1. ['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
  2. 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
  3. 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
  4. 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
  5. 'sqrt', 'tan', 'tanh']

在这里,特殊字符串变量_name_ 指向模块的名字,_file_指向该模块导入的文件名

二.Python中的  包

包是一个分层次的文件目录结构,他定义了一个模块及子包,和子包下的子包等组成的Python的应用环境

简单来说,包就是文件夹,但是该文件夹下必须存在_init_.py文件,该文件的内容可以为空,_init_.py用于标识当前文件夹是一个包

注意:

  1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块

 2.1  from....import...

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误

如:from a import b.c 是语法错误

我们在与包glance同级别的文件测试

  1. 1 from glance.db import models
  2. 2 models.register_models('mysql')
  3. 3
  4. 4 from glance.db.models import register_models
  5. 5 register_models('mysql')

2.2 绝对导入和相对导入

绝对导入:以glance作为起始

相对导入:用.....或者.....的方法作为起始(只能在一个包中使用,不能用在不同的目录内)

例如:我们在glance/api/version.py中想要导入glance/cmd/manage.py

  1. glance/api/version.py
  2.  
  3. #绝对导入
  4. from glance.cmd import manage
  5. manage.main()
  6.  
  7. #相对导入
  8. from ..cmd import manage
  9. manage.main()

测试结果:注意一定要在于glance同级的文件中测试

  1. 1 from glance.api import versions

2.3 软件开发规范

  1. #=============>bin目录:存放执行脚本
  2. #start.py
  3. import sys,os
  4.  
  5. BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  6. sys.path.append(BASE_DIR)
  7.  
  8. from core import core
  9. from conf import my_log_settings
  10.  
  11. if __name__ == '__main__':
  12. my_log_settings.load_my_logging_cfg()
  13. core.run()
  14.  
  15. #=============>conf目录:存放配置文件
  16. #config.ini
  17. [DEFAULT]
  18. user_timeout = 1000
  19.  
  20. [egon]
  21. password = 123
  22. money = 10000000
  23.  
  24. [alex]
  25. password = alex3714
  26. money=10000000000
  27.  
  28. [yuanhao]
  29. password = ysb123
  30. money=10
  31.  
  32. #settings.py
  33. import os
  34. config_path=r'%s\%s' %(os.path.dirname(os.path.abspath(__file__)),'config.ini')
  35. user_timeout=10
  36. user_db_path=r'%s\%s' %(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),\
  37. 'db')
  38.  
  39. #my_log_settings.py
  40. """
  41. logging配置
  42. """
  43.  
  44. import os
  45. import logging.config
  46.  
  47. # 定义三种日志输出格式 开始
  48.  
  49. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  50. '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
  51.  
  52. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  53.  
  54. id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
  55.  
  56. # 定义日志输出格式 结束
  57.  
  58. logfile_dir = r'%s\log' %os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录
  59.  
  60. logfile_name = 'all2.log' # log文件名
  61.  
  62. # 如果不存在定义的日志目录就创建一个
  63. if not os.path.isdir(logfile_dir):
  64. os.mkdir(logfile_dir)
  65.  
  66. # log文件的全路径
  67. logfile_path = os.path.join(logfile_dir, logfile_name)
  68.  
  69. # log配置字典
  70. LOGGING_DIC = {
  71. 'version': 1,
  72. 'disable_existing_loggers': False,
  73. 'formatters': {
  74. 'standard': {
  75. 'format': standard_format
  76. },
  77. 'simple': {
  78. 'format': simple_format
  79. },
  80. },
  81. 'filters': {},
  82. 'handlers': {
  83. #打印到终端的日志
  84. 'console': {
  85. 'level': 'DEBUG',
  86. 'class': 'logging.StreamHandler', # 打印到屏幕
  87. 'formatter': 'simple'
  88. },
  89. #打印到文件的日志,收集info及以上的日志
  90. 'default': {
  91. 'level': 'DEBUG',
  92. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  93. 'formatter': 'standard',
  94. 'filename': logfile_path, # 日志文件
  95. 'maxBytes': 1024*1024*5, # 日志大小 5M
  96. 'backupCount': 5,
  97. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  98. },
  99. },
  100. 'loggers': {
  101. #logging.getLogger(__name__)拿到的logger配置
  102. '': {
  103. 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  104. 'level': 'DEBUG',
  105. 'propagate': True, # 向上(更高level的logger)传递
  106. },
  107. },
  108. }
  109.  
  110. def load_my_logging_cfg():
  111. logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
  112. logger = logging.getLogger(__name__) # 生成一个log实例
  113. logger.info('It works!') # 记录该文件的运行状态
  114.  
  115. if __name__ == '__main__':
  116. load_my_logging_cfg()
  117.  
  118. #=============>core目录:存放核心逻辑
  119. #core.py
  120. import logging
  121. import time
  122. from conf import settings
  123. from lib import read_ini
  124.  
  125. config=read_ini.read(settings.config_path)
  126. logger=logging.getLogger(__name__)
  127.  
  128. current_user={'user':None,'login_time':None,'timeout':int(settings.user_timeout)}
  129. def auth(func):
  130. def wrapper(*args,**kwargs):
  131. if current_user['user']:
  132. interval=time.time()-current_user['login_time']
  133. if interval < current_user['timeout']:
  134. return func(*args,**kwargs)
  135. name = input('name>>: ')
  136. password = input('password>>: ')
  137. if config.has_section(name):
  138. if password == config.get(name,'password'):
  139. logger.info('登录成功')
  140. current_user['user']=name
  141. current_user['login_time']=time.time()
  142. return func(*args,**kwargs)
  143. else:
  144. logger.error('用户名不存在')
  145.  
  146. return wrapper
  147.  
  148. @auth
  149. def buy():
  150. print('buy...')
  151.  
  152. @auth
  153. def run():
  154.  
  155. print('''
  156. 购物
  157. 查看余额
  158. 转账
  159. ''')
  160. while True:
  161. choice = input('>>: ').strip()
  162. if not choice:continue
  163. if choice == '':
  164. buy()
  165.  
  166. if __name__ == '__main__':
  167. run()
  168.  
  169. #=============>db目录:存放数据库文件
  170. #alex_json
  171. #egon_json
  172.  
  173. #=============>lib目录:存放自定义的模块与包
  174. #read_ini.py
  175. import configparser
  176. def read(config_file):
  177. config=configparser.ConfigParser()
  178. config.read(config_file)
  179. return config
  180.  
  181. #=============>log目录:存放日志
  182. #all2.log
  183. [2017-07-29 00:31:40,272][MainThread:11692][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  184. [2017-07-29 00:31:41,789][MainThread:11692][task_id:core.core][core.py:25][ERROR][用户名不存在]
  185. [2017-07-29 00:31:46,394][MainThread:12348][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  186. [2017-07-29 00:31:47,629][MainThread:12348][task_id:core.core][core.py:25][ERROR][用户名不存在]
  187. [2017-07-29 00:31:57,912][MainThread:10528][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  188. [2017-07-29 00:32:03,340][MainThread:12744][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  189. [2017-07-29 00:32:05,065][MainThread:12916][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  190. [2017-07-29 00:32:08,181][MainThread:12916][task_id:core.core][core.py:25][ERROR][用户名不存在]
  191. [2017-07-29 00:32:13,638][MainThread:7220][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  192. [2017-07-29 00:32:23,005][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
  193. [2017-07-29 00:32:40,941][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
  194. [2017-07-29 00:32:47,222][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
  195. [2017-07-29 00:32:51,949][MainThread:7220][task_id:core.core][core.py:25][ERROR][用户名不存在]
  196. [2017-07-29 00:33:00,213][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
  197. [2017-07-29 00:33:50,118][MainThread:8500][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
  198. [2017-07-29 00:33:55,845][MainThread:8500][task_id:core.core][core.py:20][INFO][登录成功]
  199. [2017-07-29 00:34:06,837][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]
  200. [2017-07-29 00:34:09,405][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]
  201. [2017-07-29 00:34:10,645][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

示例规范

Python之模块和包(Day21)的更多相关文章

  1. Python之模块和包导入

    Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...

  2. 一文搞懂 Python 的模块和包,在实战中的最佳实践

    最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...

  3. day21 python之模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  4. python 深入模块和包

    模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...

  5. (Python )模块、包

    本节开始学习模块的相关知识,主要包括模块的编译,模块的搜索路径.包等知识 1.模块 如果我们直接在解释器中编写python,当我们关掉解释器后,再进去.我们之前编写的代码都丢失了.因此,我们需要将我们 ...

  6. Python 基金会 —— 模块和包简介

    一.模块(Module) 1.模块的作用      在交互模式下输出的变量和函数定义,一旦终端重新启动后,这些定义就都不存在了,为了持久保存这些变量.函数等的定义,Python中引入了模块(Modul ...

  7. python基础-------模块与包(一)

    模块与包 Python中的py文件我们拿来调用的为之模块:主要有内置模块(Python解释器自带),第三方模块(别的开发者开发的),自定义模块. 目前我们学习的是内置模块与第三方模块. 通过impor ...

  8. python中模块,包,库的概念

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  9. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

随机推荐

  1. 【bzoj1875】【SDOI2009】【HH去散步】

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 424 [Submit][Status ...

  2. 【转载】IE下利用滤镜实现背景颜色渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. linux命名空间详解_转

    转自: Linux的命名空间详解--Linux进程的管理与调度(二) Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的 ...

  4. Python 安装 MaxMind GeoLite City

    1.先安装 geoip c library  geoip c library >= 1.4.6 installed on your machine. >= 1.4.6 installed ...

  5. Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5) 输出答案除以1e8+7的余数。

    /** 题目:Help Tomisu UVA - 11440 链接:https://vjudge.net/problem/UVA-11440 题意:给定正整数N和M, 统计2和N!之间有多少个整数x满 ...

  6. 简单熟悉eclipse

  7. Android-风格和主题

    Android-风格和主题 一 Style和主题Theme的差别 1.Theme是针对窗口级别的,改变窗口样式 2.Style是针对窗口元素级别的.改变指定控件或者Layout的样式 二 使用Styl ...

  8. android中TabHost和RadioGroup

    android底部菜单应用 博客分类: android--UI示例 TabHostMenuRadioGroupButton  在android中实现菜单功能有多种方法. Options Menu:用户 ...

  9. PYTHON MYSQL 的表创建和插入

    import mysql.connector cnx = mysql.connector.connect(user='xx',password='xx++.',host='139.107.11.166 ...

  10. PHP中通过数组遍历找出最小值

    举例: $a = array(1,2,4,0,9,8,6);//定义一个数组 $len = count($a);//获取数组的长度 $min = $a[0];//默认情况下数组的第一个值是最小的 fo ...