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

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.mfbz.cn/a/796862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身?

linux查看目录下的文件夹命令&#xff0c;find 查找某个目录&#xff0c;但是不包括这个目录本身&#xff1f; Linux中查看目录下的文件夹的命令是使用ls命令。ls命令用于列出指定目录中的文件和文件夹。通过不同的选项可以实现显示详细信息、按照不同的排序方式以及使用不同的…

Python爬虫之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

卷积神经网络可视化的探索

文章目录 训练LeNet模型下载FashionMNIST数据训练保存模型 卷积神经网络可视化加载模型一个测试图像不同层对图像处理的可视化第一个卷积层的处理第二个卷积层的处理 卷积神经网络是利用图像空间结构的一种深度学习网络架构&#xff0c;图像在经过卷积层、激活层、池化层、全连…

Android liveData 监听异常,fragment可见时才收到回调记录

背景&#xff1a;在app的fragment不可见的情况下使用&#xff0c;发现注册了&#xff0c;但是没有回调导致数据一直未更新&#xff0c;只有在fragment可见的时候才收到回调 // 观察通用信息mLightNaviTopViewModel.getUpdateCommonInfo().observe(this, new Observer<Common…

13--memcache与redis

前言&#xff1a;数据库读取速度较慢一直是无法解决的问题&#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

JVM:字节码文件

文章目录 一、Java虚拟机的组成二、字节码文件的组成1、基本信息2、常量池3、字段4、方法5、属性 三、常用的字节码工具1、javap -v 命令2、jclasslib插件3、阿里arthas 一、Java虚拟机的组成 二、字节码文件的组成 1、基本信息 魔数、字节码文件对应的Java版本号访问标识&am…

走进linux

1、为什么要使用linux 稳定性和可靠性&#xff1a; Linux内核以其稳定性而闻名&#xff0c;能够持续运行数月甚至数年而不需要重新启动。这对于服务器来说至关重要&#xff0c;因为它们需要保持长时间的稳定运行&#xff0c;以提供持续的服务 安全性&#xff1a; Linux系统…

[Vulnhub] Simple CuteNews-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:80 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) |_http-title: Please Login / CuteNews |_http-server-header: Apache/2.4.7…

【matlab】大数据基础与应用实例

目录 引言 线性回归模型 基本形式 最小二乘法 多元线性回归 线性回归的假设 模型评估 应用 独热编码 原理 应用场景 优点 缺点 数据收集 数据可视化 数据处理与分析 完整代码 引言 线性回归模型 线性回归模型是一种用于预测连续值输出&#xff08;或称为因变…

一文了解MySQL的表级锁

文章目录 ☃️概述☃️表级锁❄️❄️介绍❄️❄️表锁❄️❄️元数据锁❄️❄️意向锁⛷️⛷️⛷️ 介绍 ☃️概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0…

【PVE】新增2.5G网卡作为主网卡暨iperf测速流程

【PVE】新增2.5G网卡作为主网卡暨iperf测速流程 新增网卡 新增网卡的首先当然需要关闭PVE母机&#xff0c;把新网卡插上&#xff0c;我用淘宝遥现金搞了个红包&#xff0c;花了26元买了块SSU的2.5G网卡。说实话这个价位连散热片都没有&#xff0c;确实挺丐的。稍后测下速度看…

Spring源码十九:Bean实例化流程二

上一篇我们在Spring源码十八&#xff1a;Bean实例化流程一 中&#xff0c;主要讨论了Spring在实例化前的两重要准备工作&#xff0c;1、获取我们前面注册好的BeanDefinition&#xff0c;将GenericBeanDefinition封装为RootBeanDefinition如果Bean Definition只存在父容器中&…

iNavFlight飞控固件学习-1《开发环境搭建》

目录 文章目录 目录摘要1.官网2.形成Linux开发环境工具2.1 简介2.2 相关工具2.2.1 Ubuntu / Debian系统配置命令2.2.2 Fedora系统配置命令2.2.3 Fedora系统配置命令 2.3 克隆存储库2.4 构建工具2.5 使用cmake2.6 构建固件2.7 清除2.8 cmake 缓存维护2.9 编译通过ninja2.10 更新…

面试内容集合

用例设计方法 &#xff08;一&#xff09;等价类划分  常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理…

自注意力简介

在注意力机制中&#xff0c;每个查询都会关注所有的键值对并生成一个注意力输出。如果查询q&#xff0c;键k和值v都来自于同一组输入&#xff0c;那么这个注意力就被称为是自注意力&#xff08;self-attention&#xff09;。自注意力这部分理论&#xff0c;我觉得台大李宏毅老师…

FFmpeg开发环境搭建

FFmpeg是音视频开发必备的库&#xff0c;也是唯一的库。本文主要讲解在ubuntu22和macOS14环境下的编译安装。 为什么要自己编译呢&#xff1f;其中一个很重要的原因就是ffmpeg在编译时可以加入很多插件&#xff0c;这种特定的库网络上可能找不到编译好的版本&#xff0c;另外如…

在linux中查找 / 目录下的以.jar结尾的文件(find / -name *.jar)

文章目录 1、查找 / 目录下的以.jar结尾的文件 1、查找 / 目录下的以.jar结尾的文件 [rootiZuf6332h890vozldoxcprZ ~]# find / -name *.jar /etc/java/java-1.8.0-openjdk/java-1.8.0-openjdk-1.8.0.342.b07-1.el9_0.x86_64/lib/security/policy/limited/US_export_policy.ja…

Spring MVC 中 HttpMessageConverter 转换器

1. Spring MVC 中 HttpMessageConverter 转换器 文章目录 1. Spring MVC 中 HttpMessageConverter 转换器2. 补充&#xff1a;什么是 HTTP 消息3. 转换器3.1 转换器转换的是什么 4. Spring MVC中的 AJAX 请求5. ResponseBody 将服务器端的 return 返回值转化为“字符串(JSON格式…

RIP路由协议概述

RIP【Routing Information Protocol】 RIP是为TCP/IP 环境中开发的第一个路由选择协议标准 RIP是一个【距离——矢量】路由选择协议 当路由器的更新周期为30s到来时&#xff0c;向邻居发送路由表 RIP以跳数作为唯一度量值 RIP工作原理 RIP路由协议向邻居发送整个路由表信息RI…

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间&#xff0c;docker0就是网桥&#xff0c;容器会把docker0当成路由&…