600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python编程软件例子-python面向对象编程实例

python编程软件例子-python面向对象编程实例

时间:2023-09-30 22:09:48

相关推荐

python编程软件例子-python面向对象编程实例

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

classStudent:"""学生类"""count= 0 #计数

def __init__(self, name, age):

self.name=name

self.age=age

Student.count+= 1 #要使得变量全局有效,就定义为类的属性

deflearn(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 方法

classB:"""类B"""

def __init__(self):pass

defhandle(self):print("B.handle")classA(B):"""类A"""

def __init__(self):

super().__init__()defhandle(self):

super().handle()#super依赖于继承

a=A()

a.handle()

输出:

B.handle

View Code

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

自定义用户信息数据结构, 写入文件, 然后读取出内容, 利用json模块进行数据的序列化和反序列化

定义用户类,定义方法db,例如 执行obj.db可以拿到用户数据结构

在该类中实现登录、退出方法, 登录成功将状态(status)修改为True, 退出将状态修改为False(退出要判断是否处于登录状态).密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于30秒即不允许登录)

用户数据结构:user_info

{"egon":{"password":"123",'status':False,'timeout':0},"alex":{"password":"456",'status':False,'timeout':0},

}

importjsonimporttime#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) # 序列化

classUser:"""用户类"""

def __init__(self):

self.user_dic= self.read() #初始化时将用户信息读取出来

self.username = "" #记录当前登录用户

defwrite(self):"""序列化"""with open("user_info", "w", encoding="utf-8") as f:

json.dump(self.user_dic, f)#序列化

defread(self):"""拿到用户数据"""with open("user_info", "r", encoding="utf-8") as f:

user_dic= json.load(f) #反序列化

returnuser_dicdefdb(self):print("用户数据结构:", self.user_dic)deflogin(self):"""登录"""i=0while 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 inself.user_dic:

self.user_dic[username]["timeout"] = time.time() #记录3次登录失败的时间点

self.write() #将修改保存到文件

exit("退出")defexit(self):"""退出"""

if self.username: #用户处于登录状态

self.user_dic[self.username]["status"] = False #修改用户登录状态

self.write() #将修改保存到文件

exit("用户%s退出登录" %self.username)defhelp_info(self):"""帮助信息"""

print("""命令列表:

查看数据结构:db

登录:login

退出登录:exit""")defhandle(self):"""处理用户输入命令"""

whileTrue:

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()"""输出:

请输入命令:login

username:egon

password: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

"""程序启动文件"""

importosimportsys

BASE_PATH=os.path.dirname(os.getcwd())

sys.path.insert(0, BASE_PATH)#将proj的路径添加到模块搜索路径中

from src importmainif __name__ == "__main__":

main.main()#settings.py

"""定义一些常量"""

importos

BASE_PATH=os.path.dirname(os.getcwd())

teacher_file= os.path.join(BASE_PATH, "db", "teacher_info") #教师文件路径

#main.py

"""程序运行主体,可进行菜单选择"""

from src.manager importManagerdefmain():

li=Manager.infofor i inrange(len(li)):print(i+1, li[i][0])whileTrue:

ch= input("输入序号进行操作:").strip()

getattr(Manager(), li[int(ch)-1][1])() #反射, 找到对象相应的方法并执行

#manager.py

"""创建教师,删除教师,查看教师"""

from src.my_pickle importMyPicklefrom config.settings import *

from src.teacher importTeacherclassManager:"""管理员类"""info= [("查看教师", "show_teacher"),("创建教师", "create_teacher"),

("删除教师", "delete_teacher"), ("退出", "exit")]def __init__(self):

self.teacher_pickle_obj= MyPickle(teacher_file) #实例化MyPickle类,teacher_file是settings中的教师文件路径

defshow(self, pickle_obj):"""从文件中读取信息"""pick_obj=getattr(self, pickle_obj)

data_g= pick_obj.readiter() #读取对象信息

for teacher_obj indata_g:for key in teacher_obj.__dict__:print(key, teacher_obj.__dict__[key]) #打印对象信息

print("-" * 50)defshow_teacher(self):"""查看教师信息"""

print("教师信息".center(45, "-"))

self.show("teacher_pickle_obj")defcreate_teacher(self):"""创建教师信息"""name= input("输入要创建的教师姓名:").strip()

school= input("输入教师所在学校:").strip()

teacher= Teacher(name, school) #实例化一个教师对象

self.teacher_pickle_obj.write(teacher) #将对象写入文件

print("创建教师成功!")defdelete_teacher(self):"""删除教师信息"""self.show_teacher()

inp= input("输入要删除的教师姓名:").strip()

self.teacher_pickle_obj.delete(inp)#删除

print("删除成功!")defexit(self):

exit()#my_pickle.py

"""读写文件信息"""

importpickleimportosfrom config.settings import *

classMyPickle:def __init__(self, filename):

self.filename=filenamedef write(self, data): #写入

with open(self.filename, "ab") as f:

pickle.dump(data, f)def readiter(self): #读取

with open(self.filename, "rb") as f:whileTrue:try:

data=pickle.load(f)yielddataexcept: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.py

classTeacher:"""教师类"""

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"""

importtimeimportpickleimportosimportsettingsclassMySql:"""MySql类"""

def __init__(self, host=settings.HOST, port=settings.PORT):

self.host=host

self.port=port

self.id= self.create_id() #为对象生成id

defcreate_id(self):"""为对象生成id"""

returnint(time.time())defsave(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")defget_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和port

mysql1 = MySql("192.168.0.11", 8089) #用户传入host和port

mysql1.save()

mysql.get_obj_by_id(1528189434)

View Code

settings.py

importos

DB_PATH= os.path.join(os.getcwd(), "db") #序列化的文件存放位置

HOST = "127.0.0.1"PORT= 8080

View Code

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。