【python核心】模块相关知识

【python核心】模块相关知识,第1张

文章目录
  • 模块Module
    • 定义
    • 作用
    • 调用同一个目录下的文件准备工作
    • 使用方法
    • 练习1
    • 练习2
  • 模块变量
  • 加载过程
  • 分类
  • 内置模块time
    • 练习1
    • 练习2
  • 总结


模块Module 定义

包含一系列数据、函数、类的文件,通常以.py结尾。

作用

多人合作开发

调用同一个目录下的文件准备工作

使用方法
"""
    模块
"""

# 导入方式1:
#本质∶使用变量名module01关联模块地址
# import module01
# module01.fun01()
# my02 = module01.MyClass02()
# my02.fun02()
#模块1
# 模块1的fun01
# MyClass02--fun02
#as为导入的成员起另外一个名称
import module01 as m01
m01.fun01()
my02 = m01.MyClass02()
my02.fun02()

# 导入方式2:
# 本质︰将指定的成员导入到当前模块作用域中
#小心:导入进来的成员不要和当前模块成员名称相同
# from module01 import fun01
# from module01 import MyClass02
# fun01()# 模块1的fun01
# # 如果在当前模块中有fun01的函数:
# def fun01():
#     print("当前模块fun01")
# fun01()#当前模块fun01
# my02 = MyClass02()
# my02.fun02()

# 模块1
# 模块1的fun01
# 当前模块fun01
# MyClass02--fun02

# 导入方式3:
# 本质︰将指定模块的所有成员导入到当前模块作用域中
#小心:导入进来的成员和其他模块成员冲突
# from module01 import *
# fun01()
# my02 = MyClass02()
# my02.fun02()
# 模块1
# 模块1的fun01
# MyClass02--fun02

module01.py

print("模块1")

def fun01():
    print("模块1的fun01")

class MyClass02:
    def fun02(self):
        print("MyClass02--fun02")
练习1

将之前的Vector2和DoublelistHelper定义到
double_list_helper.py模块中。
在exercise01.py模块中,实现
(1)在二维列表中,获取13位置,向左,3个元素。
(2)在二维列表中﹐获取22位置,向上,2个元素。
(3)在二维列表中﹐获取03位置,向下,2个元素。
要求∶使用三种导入方式。
体会∶哪一种更合适。

import double_list_helper
#print(double_list_helper.DoublelistHelper.elements(double_list_helper.list01, double_list_helper.Vector2(1, 3), double_list_helper.Vector2.left(), 3))#['12', '11', '10']
# print(double_list_helper.DoublelistHelper.elements(double_list_helper.list01, double_list_helper.Vector2(2, 2), double_list_helper.Vector2.up(), 2))#['12', '02']
print(double_list_helper.DoublelistHelper.elements(double_list_helper.list01, double_list_helper.Vector2(0, 3), double_list_helper.Vector2.down(), 2))#['13', '23']

from double_list_helper import  Vector2
from double_list_helper import  DoublelistHelper
from double_list_helper import  list01
# print(DoublelistHelper.elements(list01, Vector2(1, 3), Vector2.left(), 3))#['12', '11', '10']
#print(DoublelistHelper.elements(list01, Vector2(2, 2), Vector2.up(), 2))#['12', '02']
print(DoublelistHelper.elements(list01, Vector2(0, 3), Vector2.down(), 2))#['13', '23']

from double_list_helper import  *
# print(DoublelistHelper.elements(list01, Vector2(1, 3), Vector2.left(), 3))#['12', '11', '10']
#print(DoublelistHelper.elements(list01, Vector2(2, 2), Vector2.up(), 2))#['12', '02']
print(DoublelistHelper.elements(list01, Vector2(0, 3), Vector2.down(), 2))#['13', '23']

double_list_helper.py

class Vector2:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    @staticmethod
    def left():
        return Vector2(0, -1)
    @staticmethod
    def up():
        return Vector2(-1, 0)
    @staticmethod
    def down():
        return Vector2(1, 0)

list01 = [
    ["00", "01", "02", "03"],
    ["10", "11", "12", "13"],
    ["20", "21", "22", "23"],
]
list_result = []
class DoublelistHelper:
    @staticmethod
    def elements(target,vect_pos,vect_dir,count):
        for item in range(count):
            vect_pos.x += vect_dir.x
            vect_pos.y += vect_dir.y
            list_result.append(target[vect_pos.x][vect_pos.y])
        return list_result
练习2

将学生管理系统分为四个模块:
M–> model.py 数据模块
V–> ui.py`界面模块
C–> bll.py 业务逻辑模块
将调用View的代码–> main.py 入口模块
model.py

"""
    定义数据模型
"""
class StudentModel:
    """
        学生模型
    """
    def __init__(self,name="",age=0,score=0.0,id=0):
        """
            创建学生对象
        :param name::姓名,str类型
        :param age:年龄,int类型
        :param score:成绩,float类型
        :param id: 编号(该学生对象的唯一标识)
        """
        self.name = name
        self.age  =age
        self.score = score
        self.id = id

ui.py

"""
    界面代码
"""
from model import *
from bll import *
class StudentManagerView:
    """
        学生管理器视图
    """

    def __init__(self):
        self.__manager = StudentManagerController()

    def __display_menu(self):
         print("1)添加学生")
         print("2)显示学生")
         print("3)删除学生")
         print("4)修改学生")
         print("5)按照成绩升序显示学生")

    def __select_menu(self):
        item = input("请输入∶")
        if item == "1":
            self.__input_student()
        elif item == "2":
            self.__output_students(self.__manager.stu_list)
        elif item == "3":
            self.__delete_student()
        elif item == "4":
            self.__modify_student()
        elif item == "5":
            self.__output_student_by_score()

    def main(self):
        """
            界面视图入口
        """
        while True:
            self.__display_menu()
            self.__select_menu()

    def __input_student(self):
        name = input("请输入姓名∶")
        age = int(input("请输入年龄:"))
        score = float(input("请翰入成绩∶"))
        stu = StudentModel(name, age, score)
        self.__manager.add_student(stu)

    def __output_students(self,list_output):
       for item in list_output:
           print(item.id,item.name,item.age,item.score)

    def __delete_student(self):
        id = int(input("请输入编号∶"))
        if self.__manager.remove_student(id):
            print("删除成功")
        else:
            print ("删除失败")

    def __modify_student(self):
        stu = StudentModel()
        stu.id = int(input("请输入需要修改的学生编号:"))
        stu.name = input("请物入新的学生名称:")
        stu.age = int(input("请输入新的学生年龄:"))
        stu.score = float(input("请输入新的学生成绩∶"))
        if self.__manager.update_student(stu):
            print("修改成功")
        else:
            print("修改失败")

    def __output_student_by_score(self):
        self.__manager.order_by_score()
        self.__output_students(self.__manager.stu_list)

bll.py

"""
    业务逻辑处理
"""
class StudentManagerController:
    """
        学生管理控制器,负责业务逻辑处理。
    """
    # 类变量,表示初始编号。
    init_id = 1000
    def __init__(self):
        self.__stu_list = []

    @property
    def stu_list(self):
        """
            学生列表
        :return: 存储学生对象的列表
        """
        return self.__stu_list

    def add_student(self,stu_info):
        """
            添加一个新学生
        :param stu_info:没有编号的学生信息
        """
        stu_info.id = self.__generate_id()
        #self.stu_list.append(stu_info)
        self.__stu_list.append(stu_info)

    def __generate_id(self):
        StudentManagerController.init_id += 1
        return StudentManagerController.init_id

    def remove_student(self,id):
        """
            根据编号移除学生信息
        :param id:编号
        :return:是否移除
        """
        for item in self.__stu_list:
           if item.id == id:
               self.__stu_list.remove(item)
               return True#表示移除成功
        return False#表示移除失败

    def update_student(self,stu_info):
        """
            根据stu_info.id修改其他信息
        :param stu_info: 学生对象
        :return: 是否修改成功
        """
        for item in self.__stu_list:
           if item.id == stu_info.id:
               item.name = stu_info.name
               item.age = stu_info.age
               item.score = stu_info.score
               return True#表示修改成功
        return False#表示修改失败

    def order_by_score(self):
        """
            根据成绩,对self.__stu_list进行升序排列
        """
        for r in range(len(self.__stu_list)-1):
            for c in range(r+1,len(self.__stu_list)):
                if self.__stu_list[r].score > self.__stu_list[c].score:
                    self.__stu_list[r],self.__stu_list[c]  = self.__stu_list[c],self.__stu_list[r]

main.py

"""
    程序入口
"""
from ui import  *
view = StudentManagerView()
view.main()

注意:from 模块 import *
模块中以下划线(_)开头的属性,不会被导入,通常称这些成员为隐藏成员。

模块变量
  1. __all__变量:定义可导出成员,仅对from xx import * 语句有效。
    exercise01.py
from module01 import *
MyClass.fun03()
_fun02()

module01.py

#定义:当前模块哪些成员可以被from 模块 import * 导入
__all__ = ["fun01","MyClass","_fun02"]
print("模块1")

def fun01():
    print("模块1的fun01")

#只是在模块内部使用的成员,可以以单下划线开头。
#只限于from 模块 import * 有效
def _fun02():
    print("模块1的fun02")

class MyClass:
    @staticmethod
    def fun03():
        print("MyClass -- fun03")
  1. _doc__变量:文档字符串。
#可以通过该属性﹐查看文档注释
print(__doc__)
  1. __file__变量:模块对应的文件路径名。
#返回当前模块的绝对路径(从系统根目录开始计算的)
print(__file__)
  1. __name__变量:模块自身名字,可以判断是否为主模块。
    当此模块作为主模块(第一个运行的模块)运行时,__name__绑定’main”,不是主模块,而是被其它模块导入时,存储模块名。
#现象
#主模块叫做∶__main__
#非主模块叫做∶真名
print(__name__)
#作用1∶测试代码,只有从当前模块运行才会执行。不是主模块不执行。
#被其他模块导入使用
#以下为测试代码,只有从当前模块运行才会执行。
if __name__ == "_main__":

#作用2:限制只能从当前模块才执行。只有是主模块才执行。
在main.py里面加if __name__ == "_main__":
加载过程

在模块导入时,模块的所有语句会执行。
,如果一个模块已经导入,则再次导入时不会重新执行模块内的语句。

分类
  1. 内置模块(builtins),在解析器的内部可以直接使用。
  2. 标准库模块,安装Python时已安装且可直接使用。(random类就是标准库)
  3. 第三方模块(通常为开源),需要自己安装。
  4. 用户自己编写的模块(可以作为其他人的第三方模块)。
内置模块time
"""
    时间处理
"""
import  time

#1.获取当前时间戳(197011日到现在经历的秒数)
#1652072713.4642925
print(time.time())

#时间元组(年,月,日,时,分﹐秒,一周的第几天,一年的第几天,夏令时)
#时间戳 ---》时间元组
print(time.localtime(1652072713))
#通过元组的 *** 作获取时问
tuple_time = time.localtime()
for item in tuple_time:
    print(item)
print(tuple_time[1])#获取月

#通过类的 *** 作获取时问
print(type(tuple_time))
# print(time.struct_time)
print(tuple_time.tm_year)#获取年

#时间元组 --->时间戳
print(time.mktime(tuple_time))

#时间元组 -->元组
str_timo01 = time.strftime("%Y / %m / %d  %H : %M : %S " ,tuple_time)
print(str_timo01)#2022 / 05 / 09  13 : 23 : 02

#str --> 时间元组
tuple_time02 = time.strptime(str_timo01,"%Y / %m / %d  %H : %M : %S ")
print(tuple_time02)
练习1

定义函数,根据年月日,返回星期数。
"星期一“
"星期二”
"星期三”
思路∶
年月日–>时间元组
时问元组–>星期
星期–>格式

import time
def get_wday(year,month,day):
    """
        获取星期数
    :param year::param month::param day::return:星期几
    """
    tuple_time = time.strptime("%d - %d - %d"%(year,month,day), "%Y - %m - %d")
    dict_weeks = {
        0:"星期一",
        1:"星期二",
        2:"星期三",
        3:"星期四",
        4:"星期五",
        5: "星期六",
        6: "星期日",
    }
    return dict_weeks[tuple_time[6]]
re = get_wday(2022,5,9)
print(re)#星期一
练习2

练习2∶根据生日(年月日),计算活了多少天。
思路∶
年月日–>出生时间
当前时间–>出生时间
计算天数

import time
def life_days(year,month,day):
    """
        根据生日计算活了多少天
    :param year::param month::param day::return: 活的天数
    """
    tuple_time = time.strptime("%d - %d - %d"%(year,month,day), "%Y - %m - %d")
    life_time = time.time()-time.mktime(tuple_time)
    return int(life_time / 60 / 60 // 24)

print(life_days(1991,10,12))#11167

总结

模块导入:

import 模块
模块.成员名
--------------------
import 模块 as 别名
别名.成员名
-------------------
from 模块 import 成员
直接使用成员
-------------------
from 模块 import *

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/916287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存