一、单选题
关于面向过程和面向对象,下列说法错误的是(B)。
A. 面向过程和面向对象都是解决问题的一种思路
B. 面向过程是基于面向对象的
C. 面向过程强调的是解决问题的步骤
D. 面向对象强调的是解决问题的对象
2. 关于类和对象的关系,下列描述正确的是(D)。
A. 类和面向对象的核心
B. 类是现实中事物的个体
C. 对象是根据类创建的,并且一个类只能对应一个对象
D. 对象描述的是现实的个体,它是类的实例
3.构造方法的作用是(C)。
A. 一般成员方法 B. 类的初始化
C.对象的初始化 D.对象的建立
4. 构造方法是类的一个特殊方法,Python中它的名称为(C)。
A. 与类同名 B. _construct C. _init_ D. init
5. Python类中包含一个特殊的变量(A),它表示当前对象自身,可以访问类的成员
A. self B. me C.this D.与类同名
6. 下列选项中,符合类的命名规范的是(A)。
A. HolidayResort B. Holiday Resort C. hoildayResort D.hoilidayresort
7. Python中用于释放类占用资源的方法是(B)。
A. __init__ B. __del__ C. _del D. delete
二、判断题
面向对象是基于面向过程的。(F)
通过类可以创建对象,有且只有一个对象实例。(F)
方法和函数的格式是完全一样的。(T)
创建类的对象时,系统会自动调用构造方法进行初始化。(T)
创建完对象后,其属性的初始值是固定的,外界无法进行修改。(F)
使用del语句删除对象,可以手动释放它所占用的资源。(F)
三、填空题
1.在Python中,可以使用____class_______关键字来声明一个类。
2.面向对象需要把问题划分多个独立的_____对象______,然后调用其方法解决问题。
3.类的方法中必须有一个____cls_____参数,位于参数列表的开头。
4.Python提供了名称为__init__的构造方法,实现让类的对象完成初始化。
5.如果想修改属性的默认值,可以在构造方法中使用___self.xxx=xxx________设置。
四、简答题
请简述self在类中的意义。
通过类创建对象,对象在类中用self表示,可以用来标记对象的属性和方法
类是由哪三个部分组成的?
类名,特征(属性),行为(方法)
请简书构造方法和析构方法的作用。
构造函数,也称为构造器,指的是当创建对象的时候,被自动调用的函数,函数名__init__
析构函数,当对象被销毁的时候自动调用的函数,函数名__del__
五.编程题
1.写一个计算器工具类Calculator,可以进行加、减、乘、除计算
class Calculator(object):
@staticmethod
def add(x,y):
return x+y
@staticmethod
def minus(x, y):
return x - y
@staticmethod
def mul(x, y):
return x * y
@staticmethod
def div(x, y):
return x / y
a=Calculator()
print(a.minus(2,2))
print(a.add(2,2))
print(a.mul(2,2))
print(a.div(2,2))
print(Calculator.minus(2,2))
print(Calculator.add(2,2))
print(Calculator.mul(2,2))
print(Calculator.div(2,2))
2.创建一个Person类,添加一个类字段用来统计Perosn类的对象的个数
思路提示:要找到对象创建的方法 在该方法中统计对象的个数
class Person(object):
# 定义一个类属性,用于统计创建对象的个数,将其私有化
__count = 0
def __new__(cls, *args, **kwargs):
#类名.类属性
cls.__count+=1
return object.__new__(cls)
def __init__(self):
print("初始化")
@classmethod
def getcount(cls):
count=cls.__count
return count
a = Person()
b = Person()
print(Person.getcount())
#或者
class Person(object):
count = 0
#注意:构造函数实际上也是成员函数,其他用法和之前用法一样
@classmethod
def __init__(cls):
cls.count+=1
a = Person()
b = Person()
print(Person.count)
#或者
class Person(object):
count=0
def __init__(self,name):
self.name=name
Person.count+=1
a=Person("王猛")
b=Person("王猛的女朋友")
print(Person.count)
3.小明爱跑步,爱吃东西。
1)小明体重75.0公斤
2)每次跑步会减肥0.5公斤
3)每次吃东西体重会增加1公斤
从上面的语境中提取对象的属性,方法 ,进而声明成类 完成需求对应的操作
class Person(object):
def __init__(self,name,weight):
self.name=name
self.weight=weight
def eat(self):
self.weight+=1
def run(self):
self.weight -= 0.5
def __str__(self):
return f'Person(name={self.name}, weight={self.weight})'
xiaoming=Person("小明",75.0)
xiaoming.run()
print(xiaoming.weight)
xiaoming.eat()
print(xiaoming.weight)
4.需求:
1).士兵瑞恩有一把AK47
2).士兵可以开火(士兵开火扣动的是扳机)
3).枪 能够 发射子弹(把子弹发射出去)
4).枪 能够 装填子弹 --增加子弹的数量
从上面的语境中提取对象的属性,方法 ,进而声明成类 完成需求对应的操作
class Person(object):
def __init__(self,name):
self.name=name
def fire(self,gun):
gun.shoot()
def rel(self,gun):
gun.reload()
class Gun(Person):
count=0
def __init__(self,type):
self.type=type
def shoot(self):
if Gun.count>0:
Gun.count-=1
print("枪发射子弹!")
else:
print("子弹不足请装弹!")
def reload(self):
Gun.count+=1
print("枪装填子弹!")
ruien=Person("士兵瑞恩")
ak=Gun("AK47")
ruien.rel(ak)
ruien.fire(ak)
#或者
class Gun:
def __init__(self, model):
self.model = model
self.bullet_count = 0
def add_bullet(self, count):
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print('[%s] 没有子弹了...' % self.model)
return
self.bullet_count -= 1
print('[%s] 突突突...[%d]' %(self.model,self.bullet_count))
class Soldier:
def __init__(self,name,gun):
self.name = name
self.gun = gun
def fire(self):
if self.gun == None:
print('[%s] 还没有枪' %self.name)
return
print('go!!! [%s]' %self.name)
self.gun.add_bullet(50)
self.gun.shoot()
ak47 = Gun('AK47')
ryan = Soldier('Ryan', ak47)
ryan.fire()
5.图书管理系统的编写
图书类Book:
属性:书名name 作者author 是否借出isborrow 书籍位置index
注意:书籍的位置不能重复
图书管理系统BookManager类
存放图书的工具使用列表
方法:
1.添加图书
2.借书 (根据图书名字借书)
要检验图书是否存在、图书是否已经借出
3.还书
4.查询书籍 (根据名字查询)
class Book(object):
def __init__(self,name,auther,isborrow:bool,index):
self.name=name
self.auther=auther
self.isborrow=isborrow
self.index=index
def __str__(self):
return "%s-%s-%s-%s" % (self.name, self.auther, self.isborrow,self.index)
class BookManager(object):
def __init__(self,name,bookList):
self.name=name
self.bookList=bookList
def add(self,book):
self.bookList.append(book)
def loan(self,bookname):
for i in self.bookList:
if i.name==bookname:
if i.isborrow==False:
i.isborrow=True
print("成功借出")
break
else:
print("此书已借出")
break
#BookManager.bookList.pop(i)
else:
print("无此书")
def ret(self,bookname):
for i in self.bookList:
if i.name==bookname:
if i.isborrow==True:
i.isborrow=False
print("成功归还")
break
def inquire(self,bookname):
for i in self.bookList:
if i.name==bookname:
print("存在这本书!")
break
else:
print("不存在这本书!")
authors=["小王","小李","小明","小花","小草"]
names=["钢铁","蜘蛛","雷电","博士","女巫"]
isborrow=[False,False,False,False,False]
indexs=["a1","a2","a3","a4","a5"]
bos=[]
for i in range(len(names)):
bo =Book(names[i],authors[i],isborrow[i],indexs[i])
bos.append(bo)
for i in bos:
print(i)
BK=BookManager("图书管理系统",bos)
b1=Book("雪碧","可乐",False,"a6")
BK.add(b1)
BK.loan("钢铁")
BK.ret("钢铁")
BK.inquire("钢铁")
选做题
商品类Goods:
属性: 商品名称name 商品价格price 商品剩余量balance
商品仓库类Storage
属性: 商品列表goods_list ,默认存放四个商品, 商品信息如下
商品名称 价格 剩余量
Mac电脑 20000 100
PthonBook 30 200
草莓键盘 80 60
iPhone 7000 70
购物车类GoodsCar:
属性为商品列表buy_list:程序初始时,商品列表为空
用户类User:
属性有:
姓名name
用户id【这个标识对于每个用户而言是唯一的]】
密码password
拥有购物车goods_car
用户登录状态is_login【默认为 False 表示没有登录】
程序App类
属性:存放用户的字典 user_dict
因为一个程序可能有很多用户,将注册的用户添加在字典中
key:用户id 【用户id随机产生即可,从10000~99999中随机产生一个】
value:对应的用户对象
方法:
1.用户注册——》根据下面信息生成一个用户
随机产生 id
输入姓名和密码
创建一个购物车对象
根据这些信息创建出用户对象 并存放与字典中
2.登录 ——》 登录成功返回为 True 否则返回为 False
输入用户id 检测是否有该用户 没有的话提示注册
有的话检测用户登录状态 若为 True 提示已登录
否则 再输入密码进行登录
登陆成功后不要忘记修改用户的登录状态
3.购买商品 ——》验证用户是否登录,没有登录提示登录
否则
列出仓库中商品名单
1. Mac电脑
2.PthonBook
3.草莓键盘
4.iPhone
用户输入对应的编号 在仓库中获得对应的商品
用户输入数量 — 与该商品的的剩余量对比
> 剩余量
让用户重新输入并提示该商品的剩余量
<=剩余量
将该商品添加在该用户的购物车中
并将仓库中的数据量做出相应的减少
4.删除购物车的商品——》验证用户是否登录,没有登录提示登录
否则
请用户输入商品名字 查看该用户的购物车中是否有该商品
如果没有,提示购物车中没有该商品
否则:
先选择要删除的商品
请用户设置删除的数量
数量 >= 购物车中商品数量
购物车清单中删除该商品
否则:
购物车清单中做出相应的减少
5.结算——》验证用户是否登录 没有登录提示登录
否则
获取该用户的购物车中商品清单,计算总额
注意: 结算完成 购物车清空
6.退出登录———》验证用户是否登录 没有登录提示登录
否则
修改用户登录状态
一、面向对象综合案例-购物车管理系统
""" 属性: 商品名称name 商品价格price 商品剩余量balance """ class Goods(object): __slots__ = ("gname","price","balance") def __init__(self,gname,price,balance): self.gname = gname self.price = price self.balance = balance def __str__(self): return "【Goods】商品名称:%s,商品价格:%s,商品剩余量:%s" % (self.gname,self.price,self.balance) __repr__ = __str__
""" 商品仓库类Storage 属性: 商品列表goods_list ,默认存放四个商品, 商品信息如下 商品名称 价格 剩余量 Mac电脑 20000 100 PthonBook 30 200 草莓键盘 80 60 iPhone 7000 70 """ import os,pickle from shopcar.goods import Goods #注意:不同的用户访问的仓库是同一个,将Storage实现未单例类 def singleton(cls): instance = None def getinstance(*agrs,**kwargs): nonlocal instance if not instance: instance = cls(*agrs,**kwargs) return instance return getinstance @singleton class Storage(object): __slots__ = ("goodslist",) def __init__(self): #当程序启动的时候,加载商品列表, # 判断如果文件存在,则直接加载文件【反序列化】,如果文件不存在,则将商品列表序列化到磁盘上 #一般情况下,在构造函数中的代码尽量简洁 self.getgoods() def getgoods(self): #假设存储商品的文件名为goodslist.txt if not os.path.exists(r"goodslist.txt"): #不存在 self.goodslist = [] #模拟商品 names = ["Mac电脑","Python Book","机械键盘","iphone"] prices = [20000,78,500,8888] balances = [100,100,100,100] #遍历列表 for i in range(len(names)): #根据已知的信息创建商品对象,然后添加到list中 goods = Goods(price=prices[i],gname=names[i],balance=balances[i]) self.goodslist.append(goods) #将数据持久化到磁盘上 self.savegoods() else: #存在 self.loadgoods() def loadgoods(self): # 将磁盘上的对象反序列化 with open(r"goodslist.txt", "rb") as f: self.goodslist = pickle.load(f) def savegoods(self): with open(r"goodslist.txt", "wb") as f: pickle.dump(self.goodslist, f)
""" 属性有: 姓名name 用户id【这个标识对于每个用户而言是唯一的]】 密码password 拥有购物车goods_car 用户登录状态is_login【默认为 False 表示没有登录】 """ class User(object): __slots__ = ("uid","uname","pwd","shopcar","islogin") def __init__(self,uid,uname,pwd,shopcar): self.uid = uid self.uname = uname self.pwd = pwd self.shopcar = shopcar #默认为 False 表示没有登录 self.islogin = False def __str__(self): return "【User】用户id:%s,姓名:%s,密码:%s,用户登录状态:%s" % (self.uid,self.uname,self.pwd,self.islogin) __repr__ = __str__
""" 属性为商品列表buy_list:程序初始时,商品列表为空 """ class GoodsCar(object): __slots__ = ("goodsdict",) def __init__(self): #程序初始时,商品字典为空 #将购物车的容器定义为字典,如果添加商品,商品对象作为key,商品数量作为value self.goodsdict = {} def __str__(self): return "【GoodsCar】商品展示:%s" % (self.goodsdict) __repr__ = __str__
""" 属性:存放用户的字典 user_dict 因为一个程序可能有很多用户,将注册的用户添加在字典中 key:用户id 【用户id随机产生即可,从10000~99999中随机产生一个】 value:对应的用户对象 方法: 1.用户注册——》根据下面信息生成一个用户 随机产生 id 输入姓名和密码 创建一个购物车对象 根据这些信息创建出用户对象 并存放与字典中 2.登录 ——》 登录成功返回为 True 否则返回为 False 输入用户id 检测是否有该用户 没有的话提示注册 有的话检测用户登录状态 若为 True 提示已登录 否则 再输入密码进行登录 登陆成功后不要忘记修改用户的登录状态 3.添加商品到购物车 ——》验证用户是否登录,没有登录提示登录 否则 列出仓库中商品名单 1. Mac电脑 2.PthonBook 3.草莓键盘 4.iPhone 用户输入对应的编号 在仓库中获得对应的商品 用户输入数量 — 与该商品的的剩余量对比 > 剩余量 让用户重新输入并提示该商品的剩余量 <=剩余量 将该商品添加在该用户的购物车中 并将仓库中的数据量做出相应的减少 4.删除购物车的商品——》验证用户是否登录,没有登录提示登录 否则 请用户输入商品名字 查看该用户的购物车中是否有该商品 如果没有,提示购物车中没有该商品 否则: 先选择要删除的商品 请用户设置删除的数量 数量 >= 购物车中商品数量 购物车清单中删除该商品 否则: 购物车清单中做出相应的减少 5.结算——》验证用户是否登录 没有登录提示登录 否则 获取该用户的购物车中商品清单,计算总额 注意: 结算完成 购物车清空 6.退出登录———》验证用户是否登录 没有登录提示登录 否则 修改用户登录状态 """ from shopcar.user import User from shopcar.goods import Goods from shopcar.goodscar import GoodsCar from shopcar.storage import Storage import os,pickle,random class Operation(object): #程序启动的时候,加载本地用户 def __init__(self): self.loadusers() #加载所有的用户,但是如果保存用户的文件不存在,则需要创建 def loadusers(self): #假设保存用户的文件为user.txt if not os.path.exists("user.txt"): #文件不存在 self.userdict = {} else: #存在 with open("user.txt","rb") as f: self.userdict = pickle.load(f) #保存用户信息,主要为了当用户信息发生改变之后,可以达到程序和本地文件之间的同步 def saveusers(self): with open("user.txt", "wb") as f: pickle.dump(self.userdict,f) #随机产生一个用户id def getuid(self): #问题:用户id是为了唯一的标记用户,一定不能重复 #注意:获取随机数的过程中,有可能出现重复,则需要避免 while True: uid = str(random.randint(10000,99999)) if uid not in self.userdict: print("用户id获取成功,是:%s" % (uid)) return uid else: print("用户id%s已经存在,需要重新获取" % (uid)) #用户注册 #思路:只要将一个用户对象保存到userdict,同时序列化到磁盘上 def user_register(self): #获取uid uid = self.getuid() #引导用户输入用户名和密码 uname = input("请输入用户名:") pwd = input("请输入密码:") #创建购物车对象 shopcar = GoodsCar() #根据上述信息创建一个用户对象 user = User(uid=uid,uname=uname,pwd=pwd,shopcar=shopcar) #将用户对象添加到用户字典中,uid作为key,用户对象作为value self.userdict[uid] = user #将用户字典对象序列化到本地 self.saveusers() print("注册成功!") #用户登录 def user_login(self): uid = input("请输入用户id:") if uid not in self.userdict: print("还未注册,请先注册") #self.user_register() return #在uid存在的情况下,通过uid获取用户对象,判断登录状态 user = self.userdict[uid] if user.islogin: print("已经处于登录状态,无需登录") #登录成功,返回当前用户 return user #用户处于未登录状态,则进行登录 count = 0 while True: count += 1 if count > 3: print("已经错误三次,禁止输入") return pwd = input("请输入你的登录密码:") if pwd == user.pwd: print("恭喜你,登录成功!") # 修改用户的登录状态 user.islogin = True #同步信息 self.saveusers() return user else: print("密码错误,请重新输入") #添加商品到购物车 def add_goods(self): #在添加商品之前,校验用户是否登录 user = self.user_login() if user == None: print("还未登录,请先登录") return #给用户展示商品 print("""仓库中的商品如下: 0.Mac电脑 1.Python Book 2.机械键盘 3.iphone """) #引导用户选择商品 index = input("请输入你需要添加的商品的编号:") #获取仓库对象 storage = Storage() #校验index if index.isdigit(): #转化为整型,要作为仓库商品列表中的下标 index = int(index) if index in range(4): #从仓库中的商品列表中获取用户指定的商品对象 sgoods = storage.goodslist[index] #引导用户输入需要购买的商品的数量【考虑理想化状态】 num = int(input("请输入需要购买的%s的数量:" % (sgoods.gname))) if num < 0: print("数量输入有误") else: while num > sgoods.balance: num = int(input("商品剩余量为:%s,请重新输入需要购买的%s的数量:" % (sgoods.balance,sgoods.gname))) else: #num <= sgoods.balance #重新创建一个商品对象【被添加到购物车中的对象】 ugoods = Goods(sgoods.gname,sgoods.price,num) #判断商品是否已经在购物车中 """ if ugoods in user.shopcar.goodsdict: user.shopcar.goodsdict[ugoods] += num else: #将商品添加到购物车中 user.shopcar.goodsdict[ugoods] = num """ user.shopcar.goodsdict[ugoods] = num #仓库中对应的商品数量随之减少 sgoods.balance -= num #同步数据 storage.savegoods() self.saveusers() print("商品添加成功") else: print("该商品还未上架") else: print("输入有误") #删除购物车中的商品 def del_goods(self): # 在删除商品之前,校验用户是否登录 user = self.user_login() if user == None: print("还未登录,请先登录") return #引导用户输入需要删除的商品名称 gname = input("请输入需要删除的商品名称:") #定义一个变量,用友记录被删除的商品对象 ugoods = None #定义一个变量,用于标记商品是否存在 flag = False #假设商品不存在 #遍历购物车中的字典 for key in user.shopcar.goodsdict: if key.gname == gname: ugoods = key flag = True if not flag: print("需要删除的商品不存在") return #操作仓库 #从仓库中获取商品对象 storage = Storage() #记录被删除的商品对应的仓库中的位置 index = 0 for i in range(len(storage.goodslist)): if gname == storage.goodslist[i].gname: index = i #根据商品的位置获取仓库中的商品对象 sgoods = storage.goodslist[index] #引导用户输入需要删除的商品的 数量 num = int(input("请输入需要删除的商品%s的数量" % (ugoods.gname))) if num >= ugoods.balance: #全部删除 #直接从购物车的字典中删除键值对 user.shopcar.goodsdict.pop(ugoods) #给仓库中加回去 sgoods.balance += ugoods.balance else: #删除部分 #减少数量 ugoods.balance -= num #给购物车的字典重新赋值 user.shopcar.goodsdict[ugoods] = ugoods.balance #给仓库中加回去 sgoods.balance += num #同步 storage.savegoods() self.saveusers() print("删除成功") #结算购物车 def total(self): # 在结算之前,校验用户是否登录 user = self.user_login() if user == None: print("还未登录,请先登录") return #计算购物车种所有商品的总价 usum = 0 for ugoods,num in user.shopcar.goodsdict.items(): usum += ugoods.price * num print("总计为:%s" % (usum)) #清空购物车 user.shopcar.goodsdict.clear() #同步 self.saveusers() print("结算成功") #退出登录 def exit(self): user = self.user_login() if user != None: #修改islogin的状态 user.islogin = False self.saveusers() print("退出成功")
from shopcar.operation import Operation def main(): #创建一个operation的对象 op = Operation() print("欢迎进入xxx自助购物系统".center(30,"=")) while True: print("""本系统提供了如下操作: 1.注册 2.登录 3.添加商品 4.删除商品 5.结算购物车 6.退出登录 7.退出系统 """) select = input("请输入你要进行的操作:") if select == "1": op.user_register() elif select == "2": op.user_login() elif select == "3": op.add_goods() elif select == "4": op.del_goods() elif select == "5": op.total() elif select == "6": op.exit() elif select == "7": print("欢迎再次光临") break else: print("该系统没有该功能") if __name__ == "__main__": main()