吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1087|回复: 8
收起左侧

[学习记录] 【Python】面向对象

[复制链接]
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
 楼主| 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
分配职责:
       界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等
       逻辑控制类:负责存储学生信息,处理业务逻辑。比如添加、删除等
       数据模型类:定义需要处理的数据模型。比如学生信息


练习:
[Python] 纯文本查看 复制代码
"""
学生信息管理系统
数据模型类: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[j].score < self.__stu_list[i].score:
                    self.__stu_list[i], self.__stu_list[j] = self.__stu_list[j], self.__stu_list[i]


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
[Python] 纯文本查看 复制代码
"""
定义狗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原则
开-闭原则(目标,总的指导思想)
对扩展开放,对修改关闭。
增加新功能,不改变原有代码

类的单一职责(一个类的定义):
一个类有且只有一个改变它的原因

依赖倒置(依赖抽象):
客户端代码(调用的类)尽量依赖(使用)抽象
抽象不应该依赖细节,细节应该依赖抽象


练习:
超市结算系统:
[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()
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表