python面向对象编程实例
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个学生
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
3.编写程序, 如下有三点要求:
- 自定义用户信息数据结构, 写入文件, 然后读取出内容, 利用json模块进行数据的序列化和反序列化
- 定义用户类,定义方法db,例如 执行obj.db可以拿到用户数据结构
- 在该类中实现登录、退出方法, 登录成功将状态(status)修改为True, 退出将状态修改为False(退出要判断是否处于登录状态).密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于30秒即不允许登录)
用户数据结构:user_info
{
"egon":{"password":"",'status':False,'timeout':0},
"alex":{"password":"",'status':False,'timeout':0},
}
import json
import 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() """
输出:
请输入命令:login
username:egon
password:123
------egon登陆成功-----
请输入命令:exit
用户egon退出登录
"""
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 os
import sys
BASE_PATH = os.path.dirname(os.getcwd())
sys.path.insert(0, BASE_PATH) # 将proj的路径添加到模块搜索路径中
from src import main if __name__ == "__main__":
main.main() # settings.py
"""定义一些常量"""
import os BASE_PATH = os.path.dirname(os.getcwd())
teacher_file = os.path.join(BASE_PATH, "db", "teacher_info") # 教师文件路径 # main.py
"""程序运行主体,可进行菜单选择"""
from src.manager import Manager def 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 MyPickle
from config.settings import *
from src.teacher import Teacher class 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 pickle
import os
from 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.py class Teacher:
"""教师类"""
def __init__(self, name, school):
self.name = name
self.school = school
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 time
import pickle
import os
import settings class 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和port
mysql1 = MySql("192.168.0.11", 8089) # 用户传入host和port
mysql1.save()
mysql.get_obj_by_id(1528189434)
settings.py
import os
DB_PATH = os.path.join(os.getcwd(), "db") # 序列化的文件存放位置
HOST = "127.0.0.1"
PORT = 8080
python面向对象编程实例的更多相关文章
- python面向对象编程实例解析
1. 类和函数 面向对象编程的例子: #!/usr/bin/env python # -*- coding: utf-8 -*- class Person(object): #在属性和变量的前面增加“ ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- Python3面向对象编程实例
/*认真研究完这个实例,理解python面向对象编程的方法*/class Person: """人员信息""" # 姓名(共有属性) nam ...
随机推荐
- js实现打字效果
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>js typing& ...
- 题解报告:hdu 2086 A1 = ?
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2086 Problem Description 有如下方程:Ai = (Ai-1 + Ai+1)/2 - ...
- Access OLE对象和附件的区别
OLE 对象 来自 Office 和基于 Windows 的程序的图像.文档.图形和其他对象 最多可存储 2GB 数据(此大小限制适用于所有 Access 数据库).请记住,添加 2GB 数据会导致数 ...
- Oracle报错:"ORA-18008: 无法找到 OUTLN 方案 "的解决方案
Oracle报错:"ORA-18008: 无法找到 OUTLN 方案 "的解决方案 今天连接到Oracle报错:ORA-18008: 无法找到 OUTLN 方案,前天还用得 ...
- D. Artsem and Saunders 数学题
http://codeforces.com/contest/765/problem/D 这题的化简,不能乱带入,因为复合函数的带入,往往要严格根据他们的定义域的 题目要求出下面两个函数 g[h(x)] ...
- Redis和SpringDataRedis
一.Redis简介 Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,运行在内存中,由ANSI C编写.企业开发通常采用Redis来实现缓存.同类的产品还有memcac ...
- spark编译错误解决 Error:(52, 75) not found: value TCLIService
对于2.20版本可能会出现以下问题: spark\sql\hive-thriftserver\src\main\java\org\apache\hive\service\cli\thrift\Thri ...
- iOS:swift :可选类型
import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil ...
- js几个逻辑运算符的形象概括
“&&”是逻辑与操作符,只有“&&”两边值同时满足(同时为真),整个表达式值才为真. b>a && b<c //“&& ...
- C/C++ new/delete []、内存泄漏、动态数组
一.概念 new/delete是用于动态分配和撤销内存的运算符.new/delete是c++里才有的,c中是用malloc和free,c++虽然也可以用,但是不建议用.当我们使用关键字new在堆上动态 ...