Python之路【第四篇】:模块
模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块
- 内置模块
- 开源模块
一、自定义模块
1、定义模块
情景一:
情景二:
情景三:
2、导入模块
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
1 import module #直接导入已知开源模块 2 from module.xx.xx import xx #导入模块中的class 3 from module.xx.xx import xx as rename #导入模块中的class,并可以重命名代入。 4 from module.xx.xx import *
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
1 import sys 2 print sys.path 3 4 #Outcomes: 5 ['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/tlfox/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
通过os模块可以获取各种目录,例如:
1 import sys 2 import os 3 4 pre_path = os.path.abspath('../') 5 sys.path.append(pre_path)
二、开源模块
1. 下载安装
下载安装有两种方式:
1 yum 2 pip 3 apt-get 4 ...
1 下载源码 2 解压源码 3 进入目录 4 编译源码 python setup.py build 5 安装源码 python setup.py install
注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行:
1 yum install gcc 2 yum install python-devel 3 或 4 apt-get python-dev
安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:
/usr/lib/python2.7 or python3.x
2. 导入模块
同自定义模块中导入的方式
三、三层架构
project_01
├── conf.py
├── index.py # 作为主文件,程序入口,即程序执行时,先执行的文件.index再会去触发其他model的其他类或其他类里的方法.
├── model # 在此文件夹中,数据库有几张表,就建立几个文件,并与数据库的名要一一对应.
├── __init__.py
└── admin.py
└── utility # 存放公共操作的功能的py文件. 比如: 存放对数据库进行操作的功能. 对一类的操作都通过utility下的py文件去执行.
├── __init__.py
└── mysql_helper.py
index.py
1 from model.admin import Admin 2 3 def main(): 4 5 # Call Admin.GetOne() -> MysqlHelper.ShowTables() 6 sql = 'select * from students' 7 data = Admin() 8 data01 = data.GetOne(sql) 9 print(data01) 10 11 # Call Admin.GetOne_where() -> MysqlHelper.SelectData() 12 sql02 = 'select * from students where name=%s' 13 parameters = ('alex',) 14 data02 = data.GetOne_where(sql02,parameters) 15 print(data02) 16 #注:可以用input把输入数据代入。
name = input('please enter the name you want to search out: ')
Parameters = (name,) 17 if __name__ == "__main__": 18 main()
├── model
└── admin.py
1 import sys 2 sys.path.append('../') # How to import a python module from another folders. 3 from utility.mysql_helper import MysqlHelper 4 5 class Admin(object): 6 7 def __init__(self): 8 self.__helper = MysqlHelper('127.0.0.1','root','Tl198312!') #self.__helper equals a class variable. 9 10 11 def GetOne(self,sql): 12 data = self.__helper.ShowTables(sql) 13 return (data) 14 15 def GetOne_where(self,sql,parameters): 16 data = self.__helper.SelectData(sql,parameters) 17 return (data) 18 19 20 if __name__ == "__main__": 21 sql = 'select * from students' 22 #you have to assign the Class Admin() to data first, and then call the method of GetOne(sql). 23 data = Admin() 24 data01 = data.GetOne(sql) 25 print(data01) 26 sql02 = 'select * from students where name=%s' 27 parameters = ('alex',) 28 data02 = data.GetOne_where(sql02,parameters) 29 print(data02) 30 31 #TypeError: GetOne() missing 1 required positional argument:'sql' 32 #data = Admin.GetOne1(sql) 33 #print(data) or print(Admin.GetOne1(sql)
└── utility
└── mysql_helper.py
1 import MySQLdb 2 3 class MysqlHelper(object): 4 def __init__(self,Host, Name, Password): 5 self.Host = Host 6 self.Name = Name 7 self.Password = Password 8 9 10 def ShowTables(self,sql): 11 conn = MySQLdb.connect(host=self.Host,user=self.Name ,passwd=self.Password,db='mydb') 12 cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) 13 14 reCount = cur.execute(sql) 15 16 #print (cur.fetchone()) 17 data = cur.fetchall() 18 19 cur.close() 20 conn.close() 21 22 return data 23 24 def SelectData(self,sql,parameters): 25 conn = MySQLdb.connect(host=self.Host,user=self.Name ,passwd=self.Password,db='mydb') 26 cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) 27 28 reCount = cur.execute(sql,parameters) 29 30 #print (cur.fetchone()) 31 data = cur.fetchall() 32 33 cur.close() 34 conn.close() 35 36 return data 37 38 39 if __name__ == "__main__": 40 #注:self的参数代入和类的方法参数代入是不一样的。 41 helper = MysqlHelper('127.0.0.1','root','Tl198312!') 42 sql = 'select * from students' 43 data = helper.ShowTables(sql) 44 sql02 = 'select * from students where id=%s' 45 parameters = (1,) 46 data02 = helper.SelectData(sql02,parameters) 47 print(data) 48 print(data02)
总结:每层只能调用相邻层,而不能跨层调用。
三层结构:
- 数据访问层
- 业务处理层
- 表示层,UI层