【Python】面向对象
练习——面向对象的学习学会分类并知道定义类的原因,并锻炼编程的思路
"""
张无忌 教 赵敏 乾坤大挪移
赵敏 教 张无忌 化妆
张无忌 上班 挣了 10000
赵敏 上班 挣了 6000
"""
class Person:
def __init__(self, name=None):
self.name = name
def teach(self, student, thing):
print(self.name + '教' + student.name + thing)
def work(self, money):
print(self.name + '上班挣了' + str(money))
z01 = Person('张无忌')
z02 = Person('赵敏')
z01.teach(z02, '乾坤大挪移')
z02.teach(z01, '化妆')
z01.work(10000)
z02.work(6000)
试了一下还行 mark了 一直不明白这样写和不用class直接def有啥区别 dft2010 发表于 2022-3-24 20:48
一直不明白这样写和不用class直接def有啥区别
class是面向对象的编程,个人觉得有以下几点:
1.在需要创建对象的时候可以直接调用类,比如这个例题中的Person('张无忌');
2.在调用函数的时候很方便查找,可能有的函数名字记不住或者对象函数很多,直接在对象后加'.'就会自动提示可用函数。
我也是初学,教程中说的是,向类外提供必要的功能,隐藏不必要的细节;分而治之,变则疏之。如果全是函数没有类,对于像例题这样简单的东西没啥影响,但是函数比较多时就不方便使用,维护和管理了 本帖最后由 zhqfangv587 于 2022-3-25 16:48 编辑
项目流程
1.提出需求需求分析说明书 “产品经理”/“项目经理——项目领导者”
2.需求分析说明书 概要设计 项目经理
3.概要设计 详细设计 项目经理 OOA/OOD 架构师
4.详细设计 开发计划 项目经理
5.编码 程序员
6.软件测试 测试用例 软件测试工程师
7.系统运维 运维工程师
8.用户测试 客户
9.项目维护 程序和服务器
案例:信息管理系统
程序架构:数据模型(Model)+界面视图(View)+逻辑控制(Controller),即MVC
分配职责:
界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等
逻辑控制类:负责存储学生信息,处理业务逻辑。比如添加、删除等
数据模型类:定义需要处理的数据模型。比如学生信息
练习:
"""
学生信息管理系统
数据模型类:StudentModel
数据:编号id,姓名name,年龄age,成绩score
逻辑控制类:StudentManagerController
数据:学生列表__stu_list
行为:获取列表 stu_list,
添加学生add_student(添加id 整数 递增 类变量)
删除学生remove_student(根据id删除学生,删除后返回结果:成功True或失败False)
修改学生信息update_student()
根据成绩由高到低排序order_by_score()
"""
class StudentModel:
'''
学生模型
'''
def __init__(self, name, age, score):#id不需要传值,放在最后
'''
保存学生信息
:param id:学号int
:param name: 姓名str
:param age: 年龄int
:param score: 成绩float
'''
self.id = StudentManagerController.id
self.name = name
self.age = age
self.score = score
class StudentManagerController:
'''
学生管理控制器执行学生信息处理逻辑
'''
id = 10220001
def __init__(self):
self.__stu_list = []
@property
def stu_list(self):
return self.__stu_list
# @stu_list.setter #修改列表不需要在这里设置方法,列表本身就可以修改
# def stu_list(self, value):
# self.stu_list.append(value)
def add_student(self, stu):
"""
添加学生信息
:param stu: 学生信息StudentModel生成
:return:
"""
self.__id_generate(stu)
self.__stu_list.append(stu)
StudentManagerController.id += 1
def __id_generate(self, stu):
"""
产生学号信息
:param stu:
:return:
"""
stu.id = self.id
def remove_student(self, stu):
"""
删除学生信息
:param stu:
:return:
"""
for item in self.__stu_list:
if item.id == stu.id:
self.__stu_list.remove(item)
return True
return False
def show_list(self):
"""
输出学生学号和姓名
:return:
"""
for item in self.__stu_list:
print(item.id, item.name, item.age, item.score)
def update_student(self, stu):
"""
修改学生信息
:param stu:
:return:
"""
for item in self.__stu_list:
if item.id == stu.id:
item.name = stu.name
item.age = stu.age
item.score = stu.score
def order_by_score(self):
for j in range(len(self.__stu_list)-1):
for i in range(j+1, len(self.__stu_list)):
if self.__stu_list.score < self.__stu_list.score:
self.__stu_list, self.__stu_list = self.__stu_list, self.__stu_list
manager = StudentManagerController()
stu01 = StudentModel('张三', 25, 90)
manager.add_student(stu01)
stu02 = StudentModel('李四', 30, 91)
manager.add_student(stu02)
manager.show_list()
print(manager.remove_student(stu01))
manager.show_list()
stu02.age = 35
manager.update_student(stu02)
manager.show_list()
print('----------------')
stu03 = StudentModel('赵大', 30, 93)
stu04 = StudentModel('钱二', 30, 94)
stu05 = StudentModel('孙五', 30, 95)
stu06 = StudentModel('王六', 30, 96)
stu07 = StudentModel('许七', 30, 97)
stu08 = StudentModel('白八', 30, 98)
manager.add_student(stu03)
manager.add_student(stu04)
manager.add_student(stu05)
manager.add_student(stu06)
manager.add_student(stu07)
manager.add_student(stu08)
manager.order_by_score()
manager.show_list()
zhqfangv587 发表于 2022-3-25 08:53
class是面向对象的编程,个人觉得有以下几点:
1.在需要创建对象的时候可以直接调用类,比如这个例题中 ...
还是没看懂……哈哈 dft2010 发表于 2022-3-25 21:03
还是没看懂……哈哈
简单说就是,全用def的是面向过程的编程,类似于雕版印刷术,使用class的是面向对象的编程,类似于活字印刷术 继承:
多个子类在概念上一致时,考虑抽象出一个父类
将多个子类中的共性提取到父类中
从设计角度:先有子类,再有父类
从编码角度:先有父类,再有子类
子类可以调用父类,父类不能调用子类
python内置函数:
isinstance()判断对象是否属于一个类
issubclass()判断一个类是不是另一个类的子类
EXERCISE01
"""
定义狗Dog类 跑 叫 吃
定义鸟Bird类飞 叫 吃
"""
class Animal:
def shout(self):
print('叫')
def eat(self):
print('吃')
class Dog(Animal):
def run(self):
print('跑')
class Bird(Animal):
def fly(self):
print('飞')
继承2:
若子类没有构造函数,默认使用父类的构造函数
若子类有构造函数,会覆盖父类的构造函数。要想使用父类构造函数中的属性,必须先调用父类的构造函数:super().__init__(parameter)
Python原则
开-闭原则(目标,总的指导思想)
对扩展开放,对修改关闭。
增加新功能,不改变原有代码
类的单一职责(一个类的定义):
一个类有且只有一个改变它的原因
依赖倒置(依赖抽象):
客户端代码(调用的类)尽量依赖(使用)抽象
抽象不应该依赖细节,细节应该依赖抽象
练习:
超市结算系统:
"""
超市结算系统
"""
# 商品模型id name price
class ShoppingModel:
def __init__(self, id):
self.id = id
class Good(ShoppingModel):
def __init__(self, id, name, price):
super().__init__(id)
self.name = name
self.price = price
# 订单模型id count
class Cart(ShoppingModel):
def __init__(self, id, count):
super().__init__(id)
self.count = count
# 购物车逻辑控制器
class ShoppingControl:
def __init__(self):
self.__cart_list = []
self.__good_list = []
# 加载商品
# 上架商品
def on_shelf(self, good):
self.__good_list.append(good)
# 下架商品
def off_shelf(self, id):
for item in self.__good_list:
if item.id == id:
self.__good_list.remove(item)
# 显示购物清单
def show_all(self):
print('物品清单:')
for item in self.__good_list:
print(item.id, item.name, item.price)
# 添加商品到订单
def add_shopping(self):
id = input('请输入商品id:')
count = int(input('请输入购买数量:'))
good = Cart(id, count)
self.__cart_list.append(good)
# 生成订单
def show_list(self):
print('购物车内物品id和数量:')
for item in self.__cart_list:
for item2 in self.__good_list:
if item.id == item2.id:
print(item.id, item2.name, item.count)
# 根据订单计算总价格
def total_price(self):
total_price = 0
for item in self.__cart_list:
for item2 in self.__good_list:
if item.id == item2.id:
total_price += item2.price * item.count
return total_price
# 购物车控制台界面视图
class ShoppingConsoleView:
def __init__(self):
self.manager = ShoppingControl()
def show_menu1(self):
print('*'*12)
print('按1进入商家界面')
print('按2进入营业界面')
print('按q退出程序')
print('*'*12)
# 入口 显示界面1 2 q
def show_menu2(self):
print('*'*12)
print('按1购买')
print('按2结算')
print('按q退出')
print('*'*12)
def show_menu3(self):
print('*'*12)
print('按1上架商品')
print('按2下架商品')
print('按3显示目前上架商品清单')
print('按q退出')
print('*'*12)
# 选择 1执行购买2执行结算q退出
def menu(self):
good01 = Good('101', '倚天剑', 10000)
good02 = Good('102', '屠龙刀', 10000)
good03 = Good('103', '九阳神功', 10000)
good04 = Good('104', '九阴白骨爪', 9999)
good05 = Good('105', '乾坤大挪移', 8888)
good06 = Good('106', '七伤拳', 7777)
self.manager.on_shelf(good01)
self.manager.on_shelf(good02)
self.manager.on_shelf(good03)
self.manager.on_shelf(good04)
self.manager.on_shelf(good05)
self.manager.on_shelf(good06)
while True:
self.show_menu1()
select_input1 = input('请输入:')
if select_input1 == '1':
while True:
self.show_menu3()
select_input2 = input('请输入:')
if select_input2 == '1':
id = input('请输入上架商品id:')
name = input('请输入上架商品名称:')
price = input('请输入上架商品单价:')
good = Good(id, name, price)
self.manager.on_shelf(good)
elif select_input2 == '2':
id = input('请输入要删除商品的id:')
self.manager.off_shelf(id)
elif select_input2 == '3':
self.manager.show_all()
elif select_input2 == 'q':
break
else:
print('输入有误,请重新输入')
elif select_input1 == '2':
while True:
self.show_menu2()
select_input2 = input()
if select_input2 == '1':
self.purchase()
elif select_input2 == '2':
self.settlement()
elif select_input2 == 'q':
break
else:
print('输入有误,请重新输入')
elif select_input1 == 'q':
break
else:
print('输入有误,请重新输入')
# 1执行的函数
def purchase(self):
self.manager.show_all()
self.manager.add_shopping()
# 2执行的函数
def settlement(self):
while True:
print('商品总价为:', self.manager.total_price(), '元')
money = float(input('请付款:'))
if money >= self.manager.total_price():
print('购买成功,应找零:%.2f元,欢迎再次光临' % (money-self.manager.total_price()))
break
else:
print('金额不足,', end='')
view = ShoppingConsoleView()
view.menu()
页:
[1]