HSP_15章 Python_模板设计模式和oop进阶总结

news2024/9/21 0:38:38

P136 模板设计模式

1. 设计模式简介

  1. 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式

  2. 设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索

在这里插入图片描述

2. 模板设计模式

  • 基本介绍

    • 抽象类体现的就是一种模板模式的设计,子类总体上会保留抽象类的行为方式
    • 抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
  • 模板设计模式能解决的问题

    1. 当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
    2. 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式.
  • 模板设计模式-最佳实践

  • 开发需求

  1. 有多个类,完成不同的任务job
  2. 要求统计得到各自完成任务的时间
  3. 请编程实现【文件:模板设计模式.Py]
import time


class AA:
    def job(self):
        start = time.time()
        num = 0
        for i in range(1, 10000):
            num += 1

        end = time.time()

        print("计算任务 执行时间(秒)", end - start)


class BB:
    def job(self):
        start = time.time()
        num = 0
        for i in range(1, 10000):
            num -= 1

        end = time.time()

        print("计算任务 执行时间(秒)", end - start)


if __name__ == '__main__':
    aa = AA()
    aa.job()
    bb = BB()
    bb.job()

在这里插入图片描述

  • 优化
    在这里插入图片描述

import time
from abc import ABC, abstractmethod


class AABB(ABC):

    @abstractmethod
    def job(self):
        pass

    def cal(self):
        start = time.time()* 1000
        self.job()
        end = time.time()* 1000

        print("计算任务 执行时间(毫秒)",round ((end - start),2))


class AA(AABB):
    def job(self):
        num = 0
        for i in range(1, 90000):
            num += i


class BB(AABB):

    def job(self):
        num = 0
        for i in range(1, 90000):
            num += i


if __name__ == '__main__':
    aa = AA()
    aa.cal()
    bb = BB()
    bb.cal()

3. 本章作业

涉及知识点: 冒泡排序 | list.sort() | lambda匿名函数

  • homework01.py
class Person:
    def __init__(self, name, age, job):
        self.name = name
        self.age = age
        self.job = job

    def __str__(self):
        return f"{self.name}-{self.age}-{self.job}"


p1 = Person("smith", 20, "java工程师")
p2 = Person("king", 18, "学生")
p3 = Person("HSP", 26, "老师")
my_list = [p1, p2, p3]
for p in my_list:
    print(p)

#有3个person对象,并按照age从大到小进行排序

# 方式一 : 使用冒泡排序
def bubble_sort(my_list: list[Person]):

    for i in range(1, len(my_list)):
        for j in range(0, len(my_list) - i):
            # 如果前面的元素 <后面的元素,就交换
            if my_list[j].age < my_list[j + 1].age:
                my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]
        # print(f"第{i}轮排序后的结果 my_list", my_list)

print("排序后".center(32,"-"))
# bubble_sort(my_list)
#
# # print([p for p in my_list])
# #打印出来的是地址<__main__.Person object at 0x000002125112BE20>
# for p in my_list:
#     print(p)
#

# 方式二 : 使用list.sort()方法
my_list.sort(key = lambda ele:ele.age,reverse=True)
my_list.sort(key = lambda ele:ele.name,reverse=True)
  • homework02.py
  • 子父类可以调用那些方法

class Grand:
    name = "AA"
    __age = 100
    # def __init__(self, name, age, job):
    #     self.name = name
    #     self.age = age
    #     self.job = job

    def g1(self):
        print( f"Grand-g1()")

class Father(Grand):
    id = "001"
    __score = None

    # super()可以访问哪些戏员(属性和方法)?
    # 填写? super().name,super().g1()
    # self可以访问哪些成员?
    # 填写 self.id,self.__score,self.f1()
    # self.name, self.g1(),

    def f1(self):
        print( f"Father-f1()")

class Son(Father):
    name = "BB"

    # super()可以访问哪些戏员(属性和方法)?
    # 填写? super().id,super().f1(),super().name,super().g1()
    # self可以访问哪些成员?
    # 填写 self.name,self.g1(),self.__show()
    #  self.id,self.f1()

    def g1(self):
        print( f"Son-g1()")

    def __show(sel):
        print( f"Son-__show()")
    # def hi(self):
    #     print( f"Son-hi()")

grand = Grand()
father = Father()
son = Son()
  • homework03.py

3、编写Doctor类,属性:name, age,job, gender,sal,5个参数的构造器,重写 eq ()方法,并判断测试类中创建的两个对
象是否相等(相等就是判断属性是否相同)homework03.py

# 3、编写Doctor类,
# 属性:name, age,job, gender,sal,5个参数的构造器,
# 重写 eq ()方法,并判断测试类中创建的两个对象是否相等(相等就是判断属性是否相同)

class Doctor:

  # 属性动态生成
    def __init__(self, name, age, job, gender, sal):
        self.name = name
        self.age = age
        self.job = job
        self.gender = gender
        self.sal = sal
    # 重写eq
    def __eq__(self, other):
        # 如果other类型不受Doctor直接返回false
        if isinstance(other, Doctor):
            return self.name == other.name and \
                self.age == other.age and \
                self.job == other.job and \
                self.gender == other.gender and\
                self.sal == other.sal
        return False


# 测试
doctor1 = Doctor("king",20,"牙科医","男",10000)
doctor2 = Doctor("king",21,"牙科医","男",10000)

print("doctor1==doctor2 -> ",doctor1==doctor2)

P138. Python_OOP高级知识总结

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1908471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DFS回溯剪枝|KMP通过数组记录减少判断子字符串|思路

KMP|DFS回溯剪枝 #1、NC149kmp 初步思路&#xff1a; 两层for循环&#xff0c;一个T的字符开始与 S的字符比较&#xff0c;挨个比较&#xff0c;遇到不同就continue当前T的字符&#xff0c;重复步骤》效率太低&#xff0c;超时 eg: TABSABABABD SABABD S&#xff01;A时&#…

Windows10/11家庭版开启Hyper-V虚拟机功能详解

Hyper-V是微软的一款虚拟机软件&#xff0c;可以使我们在一台Windows PC上&#xff0c;在虚拟环境下同时运行多个互相之间完全隔离的操作系统&#xff0c;这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件&#xff0c;如VMware等相比&#xff0c;Hyp…

Java版Flink使用指南——定制RabbitMQ数据源的序列化器

大纲 新建工程新增依赖数据对象序列化器接入数据源 测试修改Slot个数打包、提交、运行 工程代码 在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中&#xff0c;我们从RabbitMQ队列中读取了字符串型数据。如果我们希望读取的数据被自动化转换为一个对象&#x…

white-space属性换行

white-space 属性可以控制元素中文本的换行方式。常用的取值有&#xff1a; normal&#xff08;默认值&#xff09;&#xff1a;根据容器的大小自动换行。nowrap&#xff1a;文本不进行换行&#xff0c;超过容器宽度时会溢出。pre&#xff1a;保留原始的空白符&#xff08;空格…

5.Python学习:面向对象

1.面向对象和面向过程的区别 以下五子棋为例&#xff1a; 2.类和实例 &#xff08;1&#xff09;类是抽象的模板&#xff0c;实例是根据模板创建出来的具体的对象 &#xff08;2&#xff09;比如人类就是一个类&#xff0c;刘亦菲就是人类的一个实例 2.1 新建类和类的实例…

【uniapp-ios】App端与webview端相互通信的方法以及注意事项

前言 在开发中&#xff0c;使用uniapp开发的项目开发效率是极高的&#xff0c;使用一套代码就能够同时在多端上线&#xff0c;像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题&#xff0c;这种方式本质上实际上是h5和h5之间的通信&#xff0c;网上有非常多…

计算机的错误计算(二十五)

摘要 介绍&#xff08;不&#xff09;停机问题。给了一个算式&#xff0c;当计算机的输出为0时&#xff0c;一般需要提高计算精度继续计算&#xff0c;一直到获得非0值或有效数字。但是&#xff0c;由于事先不清楚算式的准确值是否为0或不为0&#xff0c;因此往往陷入两难境地…

LLM - Transformer 的 多头自注意力(MHSA) 理解与源码

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140281680 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 在 Transformer 中,多头自注意力机制 (MHSA, Multi-Head Self-Attenti…

关系型数据库MySQL和时序数据库的区别?

时序数据库和关系型数据库是两种不同类型的数据库系统&#xff0c;它们在设计理念、存储结构、性能优化等方面有显著差异&#xff0c;以适应不同的应用场景和需求。具体对比如下&#xff1a; 数据存储结构 时序数据库&#xff1a;使用列式存储&#xff0c;每条记录通常包含时间…

Johnson Counter

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 请用Verilog实现4位约翰逊计数器&#xff08;扭环形计数器&#xff09;&#xff0c;计数器的循环状态如下。 电路的接口如下图所示。 输入描述&#xff1a; input clk , input …

力扣喜刷刷--day1

1.无重复字符的最长子串 知识点&#xff1a;滑动窗口 基本概念 窗口&#xff1a;窗口是一个连续的子序列&#xff0c;可以是固定长度或可变长度。滑动&#xff1a;窗口在数据序列上移动&#xff0c;可以是向左或向右。边界&#xff1a;窗口的起始和结束位置。 应用场景 字符…

YOLOv10改进 | Conv篇 | 利用DualConv二次创新C2f提出一种轻量化结构(轻量化创新)

一、本文介绍 本文给大家带来的改进机制是利用DualConv改进C2f提出一种轻量化的C2f&#xff0c;DualConv是一种创新的卷积网络结构&#xff0c;旨在构建轻量级的深度神经网络。它通过结合33和11的卷积核处理相同的输入特征映射通道&#xff0c;优化了信息处理和特征提取。Dual…

关于 off-by-one 的学习

pwn的功底还很浅&#xff0c;仅仅是记录自己学习的一点心得体会。 后续随着学习深入&#xff0c;还会补知识点和题目上来。 知识点 优秀的学习资料 关于off by null的学习总结 | ZIKH26 Chunk Extend and Overlapping | ctfwiki 一点理解 与off-by-one联系很紧密的就是上…

Fastapi在docekr中进行部署之后,uvicorn占用的CPU非常高

前一段接点小活&#xff0c;做点开发&#xff0c;顺便学了学FASTAPI框架&#xff0c;对比flask据说能好那么一些&#xff0c;至少并发什么的不用研究其他的asgi什么的&#xff0c;毕竟不是专业开发&#xff0c;能少研究一个东西就省了很多的事。 但是部署的过程中突然之间在do…

典型案例 | 基于全数字实时仿真的嵌入式DevOps解决方案

为丰富浙江省信息技术应用创新&#xff08;以下简称“信创”&#xff09;产业生态&#xff0c;在全社会各领域形成示范效应&#xff0c;浙江省经信厅联合省密码管理局开展2023年浙江省深化信创典型案例评选工作。 经过征集申报、专家评选、名单公示等程序&#xff0c;确定36个…

秒懂设计模式--学习笔记(6)【创建篇-建造者模式】

目录 5、建造者模式5.1 介绍5.2 建造步骤的重要性5.3 地产开发商的困惑5.4 建筑施工方5.5 工程总监5.6 项目实施5.7 建造者模式的各角色定义5.8 建造者模式 5、建造者模式 5.1 介绍 建造者模式&#xff08;Builder&#xff09;又称为生成器模式&#xff0c;主要用于对复杂对象…

20.呼吸灯:利用PWM控制小灯在相同时间段内的不同占空比

&#xff08;1&#xff09;设计一段代码&#xff0c;实现led灯在一秒内由完全熄灭到完全点亮&#xff0c;在第二秒由完全点亮转为完全熄灭&#xff0c;循环往复。 &#xff08;2&#xff09;Verilog代码&#xff1a; module breath_led(clk,reset_n,led);input clk;input res…

Open3D 计算点云的欧式距离

目录 一、概述 1.1欧式距离定义 1.2作用和用途 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 一、概述 在Open3D中&#xff0c;compute_point_cloud_distance函数用于计算两个点云之间的距离。具体来说&#xff0c;它计算的是源点云…

进程 VS 线程(javaEE篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;JavaEE初阶&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支…

一.4 处理器读并解释储存在内存中的指令

此刻&#xff0c;hello.c源程序已经被编译系统翻译成了可执行目标文件hello&#xff0c;并被存放在硬盘上。要想在Unix系统上运行该可执行文件&#xff0c;我们将它的文件名输入到称为shell的应用程序中&#xff1a; linux>./hello hello, world linux> shell是一个命令…