博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python面向对象编程实例
阅读量:5272 次
发布时间:2019-06-14

本文共 8684 字,大约阅读时间需要 28 分钟。

1.编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生

class Student:    """学生类"""    count = 0  # 计数    def __init__(self, name, age):        self.name = name        self.age = age        Student.count += 1  # 要使得变量全局有效,就定义为类的属性    def learn(self):        print("is learning")stu1 = Student("jack", 33)stu2 = Student("amy", 24)stu3 = Student("lucy", 22)stu4 = Student("lulu", 45)print("实例化了%s个学生" % Student.count)输出:实例化了4个学生
View Code

2.编写程序, A 继承了 B, 俩个类都实现了 handle 方法, 在 A 中的 handle 方法中调用 B 的 handle 方法

class B:    """类B"""    def __init__(self):        pass    def handle(self):        print("B.handle")class A(B):    """类A"""    def __init__(self):        super().__init__()    def handle(self):        super().handle()  # super依赖于继承a = A()a.handle()输出:B.handle
View Code

3.编写程序, 如下有三点要求:

  1. 自定义用户信息数据结构, 写入文件, 然后读取出内容, 利用json模块进行数据的序列化和反序列化
  2. 定义用户类,定义方法db,例如 执行obj.db可以拿到用户数据结构
  3. 在该类中实现登录、退出方法, 登录成功将状态(status)修改为True, 退出将状态修改为False(退出要判断是否处于登录状态).密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于30秒即不允许登录)

用户数据结构:user_info

{    "egon":{
"password":"123",'status':False,'timeout':0}, "alex":{
"password":"456",'status':False,'timeout':0},}
import jsonimport time# data = {
# "egon":{"password":"123",'status':False,'timeout':0},# "alex":{"password":"456",'status':False,'timeout':0},# }## with open("user_info", "w", encoding="utf-8") as f:# json.dump(data, f) # 序列化class User: """用户类""" def __init__(self): self.user_dic = self.read() # 初始化时将用户信息读取出来 self.username = "" # 记录当前登录用户 def write(self): """序列化""" with open("user_info", "w", encoding="utf-8") as f: json.dump(self.user_dic, f) # 序列化 def read(self): """拿到用户数据""" with open("user_info", "r", encoding="utf-8") as f: user_dic = json.load(f) # 反序列化 return user_dic def db(self): print("用户数据结构:", self.user_dic) def login(self): """登录""" i = 0 while i < 3: username = input("username:").strip() password = input("password:").strip() if username in self.user_dic and password == self.user_dic[username]["password"]: time_now = time.time() # 获取当前时间 period = time_now - self.user_dic[username]["timeout"] # 时间差 if period >= 30: # 判断时间间隔是否满足登录条件 print("------%s登陆成功-----" % username) self.username = username self.user_dic[username]["status"] = True # 记录用户登录状态 self.write() # 将修改保存到文件 break else: print("用户处于锁定状态,请%s S后再试" % (30 - period)) break else: print("用户名或密码错误!") i += 1 if i == 3 and username in self.user_dic: self.user_dic[username]["timeout"] = time.time() # 记录3次登录失败的时间点 self.write() # 将修改保存到文件 exit("退出") def exit(self): """退出""" if self.username: # 用户处于登录状态 self.user_dic[self.username]["status"] = False # 修改用户登录状态 self.write() # 将修改保存到文件 exit("用户%s退出登录" % self.username) def help_info(self): """帮助信息""" print("""命令列表: 查看数据结构:db 登录:login 退出登录:exit""") def handle(self): """处理用户输入命令""" while True: cmd = input("请输入命令:").strip() cmd = cmd.split() if hasattr(self, cmd[0]): # 使用反射 func = getattr(self, cmd[0]) # 拿到方法名 func() else: self.help_info() # 打印帮助信息user = User()if __name__ == "__main__": user.handle()"""输出:请输入命令:loginusername:egonpassword:123------egon登陆成功-----请输入命令:exit用户egon退出登录"""
View Code

4.用面向对象的形式编写一个老师角色, 并实现以下功能, 获取老师列表, 创建老师、删除老师、创建成功之后通过 pickle 序列化保存到文件里,并在下一次重启程序时能

读取到创建的老师, 例如程序目录结构如下.

proj|-- bin/|   |-- start.py         程序启动文件|-- config/|   |-- settings.py     程序配置(例如: 配置存储创建老师的路径相关等)|-- db                  数据存储(持久化, 使得每次再重启程序时, 相关数据对应保留)|   |-- teachers/          存储所有老师的文件|   |-- ...                ...|-- src/                程序主体模块存放|   |-- __init__.py|   |-- teacher.py      例如: 实现老师相关功能的文件|   |-- group.py        例如: 实现班级相关的功能的文件    |-- main.py         程序运行主体程序(可进行菜单选择等)|-- README.md 程序说明文件

代码:

# start.py"""程序启动文件"""import osimport sysBASE_PATH = os.path.dirname(os.getcwd())sys.path.insert(0, BASE_PATH)  # 将proj的路径添加到模块搜索路径中from src import mainif __name__ == "__main__":    main.main()# settings.py"""定义一些常量"""import osBASE_PATH = os.path.dirname(os.getcwd())teacher_file = os.path.join(BASE_PATH, "db", "teacher_info")  # 教师文件路径# main.py"""程序运行主体,可进行菜单选择"""from src.manager import Managerdef main():    li = Manager.info    for i in range(len(li)):        print(i+1, li[i][0])    while True:        ch = input("输入序号进行操作:").strip()        getattr(Manager(), li[int(ch)-1][1])()  # 反射, 找到对象相应的方法并执行# manager.py"""创建教师,删除教师,查看教师"""from src.my_pickle import MyPicklefrom config.settings import *from src.teacher import Teacherclass Manager:    """管理员类"""    info = [("查看教师", "show_teacher"),("创建教师", "create_teacher"),            ("删除教师", "delete_teacher"), ("退出", "exit")]    def __init__(self):        self.teacher_pickle_obj = MyPickle(teacher_file)  # 实例化MyPickle类,teacher_file是settings中的教师文件路径    def show(self, pickle_obj):        """从文件中读取信息"""        pick_obj = getattr(self, pickle_obj)        data_g = pick_obj.readiter()  # 读取对象信息        for teacher_obj in data_g:            for key in teacher_obj.__dict__:                print(key, teacher_obj.__dict__[key])  # 打印对象信息            print("-" * 50)    def show_teacher(self):        """查看教师信息"""        print("教师信息".center(45, "-"))        self.show("teacher_pickle_obj")    def create_teacher(self):        """创建教师信息"""        name = input("输入要创建的教师姓名:").strip()        school = input("输入教师所在学校:").strip()        teacher = Teacher(name, school)  # 实例化一个教师对象        self.teacher_pickle_obj.write(teacher)  # 将对象写入文件        print("创建教师成功!")    def delete_teacher(self):        """删除教师信息"""        self.show_teacher()        inp = input("输入要删除的教师姓名:").strip()        self.teacher_pickle_obj.delete(inp)  # 删除        print("删除成功!")    def exit(self):        exit()# my_pickle.py"""读写文件信息"""import pickleimport osfrom config.settings import *class MyPickle:    def __init__(self, filename):        self.filename = filename    def write(self, data):  # 写入        with open(self.filename, "ab") as f:            pickle.dump(data, f)    def readiter(self):  # 读取        with open(self.filename, "rb") as f:            while True:                try:                    data = pickle.load(f)                    yield data                except:                    break    def delete(self, name):  # 删除        f2 = MyPickle(self.filename+".bak")  # 新建一个文件        for item in self.readiter():  # 从文件中load数据            if item.name == name:                pass  # 找到了就不写入            else:                f2.write(item)  # 没找到就将对象写入文件        os.remove(self.filename)  # 删除旧文件        os.rename(self.filename+".bak", self.filename)  # 新文件名重命名为旧文件名# teacher.pyclass Teacher:    """教师类"""    def __init__(self, name, school):        self.name = name        self.school = school
View Code

 5、定义MySQL类

要求:

1.对象有id、host、port三个属性

2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一

3.提供两种实例化方式,方式一:用户传入host和port 方式二:从配置文件中读取host和port进行实例化

4.为对象定制方法,save和get_obj_by_id,save能自动将对象序列化到文件中,文件路径为配置文件中DB_PATH,文件名为id号,保存之前验证对象是否已经存在,若存在则抛出异常,;get_obj_by_id方法用来从文件中反序列化出对象

mysql.py

"""以时间戳作为对象的id"""import timeimport pickleimport osimport settingsclass MySql:    """MySql类"""    def __init__(self, host=settings.HOST, port=settings.PORT):        self.host = host        self.port = port        self.id = self.create_id()  # 为对象生成id    def create_id(self):        """为对象生成id"""        return int(time.time())    def save(self):        """将对象序列化到文件中"""        if not os.path.isfile(os.path.join(settings.DB_PATH, str(self.id))):  # 判断文件是否存在            with open(os.path.join(settings.DB_PATH, str(self.id)), "wb") as f:                pickle.dump(self, f)        else:            raise TabError("the id has already existed")    def get_obj_by_id(self, obj_id):        """反序列化对象"""        with open(os.path.join(settings.DB_PATH, str(obj_id)), "rb") as f:            mysql_obj = pickle.load(f)        print(mysql_obj)        print(mysql_obj.id,mysql_obj.host, mysql_obj.port)mysql = MySql()  # 默认从配置文件中读取host和portmysql1 = MySql("192.168.0.11", 8089)  # 用户传入host和portmysql1.save()mysql.get_obj_by_id(1528189434)
View Code

settings.py

import osDB_PATH = os.path.join(os.getcwd(), "db")  # 序列化的文件存放位置HOST = "127.0.0.1"PORT = 8080
View Code

 

转载于:https://www.cnblogs.com/yanlin-10/p/9123809.html

你可能感兴趣的文章
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
echarts饼图显示百分比
查看>>
JMS消息
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
php上传文件及头像预览
查看>>
大四java实习生的一些经历
查看>>
线程池的概念
查看>>
Oracle_Statspack性能诊断工具
查看>>
转获取sql维护的表关系
查看>>