zoukankan      html  css  js  c++  java
  • Python_Note_08Day 5_Module

    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)
    View Code

    二、开源模块

    1. 下载安装

    下载安装有两种方式:

    1 yum 
    2 pip
    3 apt-get
    4 ...
    View Code
    1 下载源码
    2 解压源码
    3 进入目录
    4 编译源码    python setup.py build
    5 安装源码    python setup.py install
    View Code

    注:在使用源码安装时,需要使用到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层
  • 相关阅读:
    Docker容器启动时初始化Mysql数据库
    使用Buildpacks高效构建Docker镜像
    Mybatis 强大的结果集映射器resultMap
    Java 集合排序策略接口 Comparator
    Spring MVC 函数式编程进阶
    换一种方式编写 Spring MVC 接口
    【asp.net core 系列】6 实战之 一个项目的完整结构
    【asp.net core 系列】5 布局页和静态资源
    【asp.net core 系列】4. 更高更强的路由
    【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建
  • 原文地址:https://www.cnblogs.com/tlfox2006/p/8537502.html
Copyright © 2011-2022 走看看