zhqfangv587 发表于 2022-3-24 16:17

【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)

KilluaAoki 发表于 2022-3-24 20:09

试了一下还行 mark了

dft2010 发表于 2022-3-24 20:48

一直不明白这样写和不用class直接def有啥区别

zhqfangv587 发表于 2022-3-25 08:53

dft2010 发表于 2022-3-24 20:48
一直不明白这样写和不用class直接def有啥区别

class是面向对象的编程,个人觉得有以下几点:
1.在需要创建对象的时候可以直接调用类,比如这个例题中的Person('张无忌');
2.在调用函数的时候很方便查找,可能有的函数名字记不住或者对象函数很多,直接在对象后加'.'就会自动提示可用函数。
我也是初学,教程中说的是,向类外提供必要的功能,隐藏不必要的细节;分而治之,变则疏之。如果全是函数没有类,对于像例题这样简单的东西没啥影响,但是函数比较多时就不方便使用,维护和管理了

zhqfangv587 发表于 2022-3-25 15:59

本帖最后由 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()



dft2010 发表于 2022-3-25 21:03

zhqfangv587 发表于 2022-3-25 08:53
class是面向对象的编程,个人觉得有以下几点:
1.在需要创建对象的时候可以直接调用类,比如这个例题中 ...

还是没看懂……哈哈

zhqfangv587 发表于 2022-3-25 22:00

dft2010 发表于 2022-3-25 21:03
还是没看懂……哈哈

简单说就是,全用def的是面向过程的编程,类似于雕版印刷术,使用class的是面向对象的编程,类似于活字印刷术

zhqfangv587 发表于 2022-3-27 11:13

继承:
多个子类在概念上一致时,考虑抽象出一个父类
将多个子类中的共性提取到父类中

从设计角度:先有子类,再有父类

从编码角度:先有父类,再有子类

子类可以调用父类,父类不能调用子类

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('飞')

zhqfangv587 发表于 2022-3-28 20:47

继承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]
查看完整版本: 【Python】面向对象