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层
  • 相关阅读:
    [BZOJ 1012][JSOI2008]最大数maxnumber(线段树)
    [BZOJ 1011][HNOI2008]遥远的行星(奇技淫巧)
    [BZOJ 1010][HNOI2008]玩具装箱toy(斜率优化Dp)
    [HDU 3507]Print Article(斜率优化Dp)
    [BZOJ 1006][HNOI2008]神奇的国度(MCS弦图的染色)
    [ZOJ 1015]Fishing Net(MCS弦图的判定)
    进程的状态及转换
    程序、进程、线程的概念与比较
    ES6 模块化规范
    DNS域名解析过程(详细)
  • 原文地址:https://www.cnblogs.com/tlfox2006/p/8537502.html
Copyright © 2011-2022 走看看