Python类的优势及应用场景深度分析(代码封装与组织、继承与代码复用、多态与接口、状态管理与行为封装)(python class)

news2024/11/27 7:26:47

文章目录

  • Python 类的优势及应用场景深度分析
    • 1. 代码封装与组织
      • 1.1 封装性
        • 示例代码:用户账户管理
      • 1.2 组织性
    • 2. 继承与代码复用
      • 2.1 继承性
        • 示例代码:员工管理系统
    • 3. 多态与接口
      • 3.1 多态性
        • 示例代码:图形渲染
    • 4. 状态管理与行为的封装
      • 4.1 状态的持久化:类可以持久化内部状态,而闭包或全局变量在这方面通常表现得不那么直观和安全。
        • 示例代码:游戏状态管理

Python 类的优势及应用场景深度分析

Python 是一种广泛使用的高级编程语言,其支持多种编程范式,包括面向对象编程(OOP)。使用 Python 类相较于其他解决方案在多个方面展示出显著优势,尤其在代码的组织、可维护性、扩展性及多态性方面。本文将深入探讨使用类的优势,并通过具体的代码示例阐明其在特定应用场景下的应用价值。

1. 代码封装与组织

1.1 封装性

类通过封装技术允许数据(属性)和代码(方法)被包裹在一个单独的自包含对象中。这种封装性不仅帮助保护数据的完整性,还提高了代码的可读性和易维护性。

示例代码:用户账户管理
class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.__balance = balance  # 私有属性

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"Added {amount} to the balance")
        else:
            print("Deposit amount must be positive")

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"Withdrew {amount} from the balance")
        else:
            print("Invalid withdrawal amount")

    def get_balance(self):
        return self.__balance

# 使用
acc = Account("John")
acc.deposit(100)
print(acc.get_balance())  # 输出: 100
acc.withdraw(50)
print(acc.get_balance())  # 输出: 50

在这里插入图片描述

1.2 组织性

类提供了一种自然的方式来将相关功能组织在一起。这种组织性使得开发者能够以模块化的方式构建和维护复杂系统。

2. 继承与代码复用

2.1 继承性

继承允许新的对象类基于现有的对象类定义。这不仅减少了代码的重复,还增强了代码的可维护性。

示例代码:员工管理系统
class Employee:
    raise_amount = 1.04  # 基本涨薪比例

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay

    def email(self):
        return f"{self.first}.{self.last}@company.com"

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amount)
        return self.pay

    def __repr__(self):
        return f"Employee('{self.first}', '{self.last}', {self.pay})"


class Developer(Employee):
    raise_amount = 1.10  # 开发者涨薪比例

    def __init__(self, first, last, pay, prog_lang):
        super().__init__(first, last, pay)
        self.prog_lang = prog_lang  # 编程语言

    def __repr__(self):
        return f"Developer('{self.first}', '{self.last}', {self.pay}, '{self.prog_lang}')"


class Manager(Employee):
    def __init__(self, first, last, pay, employees=None):
        super().__init__(first, last, pay)
        if employees is None:
            self.employees = []
        else:
            self.employees = employees

    def add_emp(self, emp):
        if emp not in self.employees:
            self.employees.append(emp)
            print(f"Added: {emp}")

    def remove_emp(self, emp):
        if emp in self.employees:
            self.employees.remove(emp)
            print(f"Removed: {emp}")

    def print_emps(self):
        print(f"{self.first} {self.last}'s team:")
        for emp in self.employees:
            print('-->', emp)


# 使用改进后的代码
dev1 = Developer('John', 'Doe', 80000, 'Python')
dev2 = Developer('Jane', 'Smith', 90000, 'Java')
mgr = Manager('Sue', 'Smith', 90000)

print("Initial team:")
mgr.print_emps()


print('-' * 50)


# 添加员工
mgr.add_emp(dev1)
mgr.add_emp(dev2)

# 打印添加后的员工名单
print("After adding employees:")
mgr.print_emps()


print('-' * 50)


# 删除一个员工
mgr.remove_emp(dev1)

# 打印删除后的员工名单
print("After removing an employee:")
mgr.print_emps()


print('-' * 50)


# 应用并打印涨薪后的薪水
print("Applying raise:")
print(f"{dev2.first}'s salary before raise: {dev2.pay}")
dev2.apply_raise()
print(f"{dev2.first}'s salary after raise: {dev2.pay}")

在这里插入图片描述

3. 多态与接口

3.1 多态性

多态性允许不同类的对象被视为同一类型的实例。这增加了程序的灵活性和扩展性。

示例代码:图形渲染
class Shape:
    def draw(self):
        raise NotImplementedError("Subclass must implement abstract method")


class Circle(Shape):
    def draw(self):
        print("Drawing a circle")


class Square(Shape):
    def draw(self):
        print("Drawing a square")


def render_shape(shape):
    shape.draw()


render_shape(Circle())  # 输出: Drawing a circle
render_shape(Square())  # 输出: Drawing a square
# 输出: NotImplementedError: Subclass must implement abstract method
render_shape(Shape())

在这里插入图片描述

4. 状态管理与行为的封装

4.1 状态的持久化:类可以持久化内部状态,而闭包或全局变量在这方面通常表现得不那么直观和安全。

示例代码:游戏状态管理
class Game:
    def __init__(self, level=0):
        print("Game initialized")
        self.level = level

    def level_up(self):
        self.level += 1
        print(f"Welcome to level {self.level}")

    def restart(self):
        self.level = 0
        print("Game restarted")


game = Game()  # 输出: Game initialized
game.level_up()  # 输出: Welcome to level 1
game.restart()  # 输出: Game restarted

在这里插入图片描述

在深入探讨 Python 类的这些优势后,可以清楚地看到,尽管其他编程技巧如函数或模块也可用于解决类似问题,但在需要结构化和可维护的大规模应用程序中,类提供了无可比拟的优势。这些优势使得 Python 类成为设计复杂系统时的首选工具。

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

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

相关文章

记录一下 Chrome浏览器打印时崩溃问题

问题描述&#xff1a; 为了查看页面内存占用情况&#xff0c;按F2,打开Memory chrome浏览器点击“打印”按钮&#xff0c;或Ctrl P 时出现如下页面 一直以为是页面问题&#xff0c;每次打印的时候遇到这种 崩溃现象 就是重新刷新页面 但今天刚开一个页面&#xff0c;内存 …

微信小程序 - 出于性能原因,对长行跳过令牌化。长行的长度可通过 “editor.maxTokenizationLineLength” 进行配置

问题描述 出于性能原因&#xff0c;对长行跳过令牌化。长行的长度可通过 “editor.maxTokenizationLineLength” 进行配置。 解决方案 设置 - 编辑器设置 - 更多编辑器设置... 搜索&#xff1a;maxtoken&#xff0c;原来是 20000&#xff0c;我改成了 200000 即可~

电脑已删除的文件在回收站找不到怎么办?数据恢复办法分享!

电脑中的数据已经成为了我们生活和工作的重要部分。无论是珍贵的照片、重要的文档&#xff0c;还是日常的工作文件&#xff0c;我们都希望能够妥善保存很久。 然而&#xff0c;误删除文件的情况时有发生&#xff0c;而当我们急切地打开回收站试图找回这些文件时&#xff0c;却…

Bev感知:sparse query

文章目录 1. 显示Bev方法介绍1.1 2D to 3D: LSS-based1.1.1 优点1.1.2 缺点1.2. 3D to 2D: BevFormer1.2.1 缺点1.2.2优点1.3 常见的Bev感知的问题2. Sparse query2.1 PETRv1创新点3D 位置编码实验对比2.2 PETRv22.2.1 时序对齐2.2.2 Feature guided 3D PE2.2.3 多任务2.2.3 性…

功能测试的内容与目的是什么?

在软件开发与测试过程中&#xff0c;功能测试是不可或缺的关键步骤&#xff0c;它主要关注软件产品是否能够按照设计规格和用户需求实现预定的功能。功能测试的内容与目的&#xff0c;简单来讲&#xff0c;就是验证软件的各种特性和功能是否正确、完整且符合预期&#xff0c;确…

【C#】汽车租赁系统设计与实现

目的&#xff1a; 设计一个简单的汽车租赁系统&#xff0c;包含以下功能&#xff1a; 添加车辆&#xff1a;用户可以添加新的车辆到系统中&#xff0c;包括车辆的品牌、型号、车牌号、日租金等信息。查找车辆&#xff1a;用户可以通过车牌号或者品牌来查找车辆&#xff0c;并…

SFNC —— 采集控制(四)

系列文章目录 SFNC —— 标准特征命名约定&#xff08;一&#xff09; SFNC —— 设备控制&#xff08;二&#xff09; SFNC —— 图像格式控制&#xff08;三&#xff09; SFNC —— 采集控制&#xff08;四&#xff09; 文章目录 系列文章目录5、采集控制&#xff08;Acquisi…

第6章 设备驱动程序(2)

目录 6.3 和文件系统关联 6.3.1 inode的设备文件成员 6.3.2 标准文件操作 6.3.3 字符设备的标准操作 6.3.4 块设备的标准操作 6.4 字符设备操作 6.4.1 表示字符设备 6.4.2 打开设备文件 6.4.3 读写操作 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后…

Vue项目中实现骨架占位效果-demo

创建组件 Skeleton.vue <template><div class"skeleton"><div class"skeleton-item" v-for"n in count" :key"n"></div></div> </template><script> export default {props: {count: {ty…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…

Unity2D游戏制作入门 | 14( 之人物实装攻击判定 )

上期链接&#xff1a;Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )-CSDN博客 上期我们聊到给人物添加三段攻击的动画&#xff0c;通过建立新的图层动画当我们按下攻击按键就会自动切换进攻击的动画&#xff0c;如果我们连续按下攻击键&#xff0c;我们还可以进行好几段的攻击…

Linux系统:信号概念 信号产生

Linux系统&#xff1a;信号概念 & 信号产生 信号概念信号产生软件信号killraiseabortalarm 硬件信号键盘产生信号硬件中断 信号概念 信号是进程之间事件异步通知的一种方式 在Linux命令行中&#xff0c;我们可以通过ctrl c来终止一个前台运行的进程&#xff0c;其实这就是…

利用K8S技术栈打造个人私有云

1.三个节点&#xff1a;master&#xff0c;slave&#xff0c;client 在Kubernetes集群中&#xff0c;三个节点的职责分别如下&#xff1a; Master节点&#xff1a; docker&#xff1a;用于运行Docker容器。 etcd&#xff1a;一个分布式键值存储系统&#xff0c;用于保存Kuberne…

微信投票源码系统+礼物+道具投票 无限多开 带完整的安装代码包以及搭建教程

系统概述 微信投票源码系统是一款基于先进技术开发的综合性投票平台&#xff0c;它不仅融合了传统投票的核心功能&#xff0c;还创新性地引入了礼物和道具投票机制&#xff0c;为用户带来了全新的投票体验。 该系统支持无限多开&#xff0c;这意味着用户可以根据实际需求&…

AI写真:ControlNet 之 InstantID

但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好&#xff0c;SDXL 模型上的表现较差&#xff0c;不能用于实际生产。可是很多同学已经在使用SDXL了&#xff0c;而且SDXL确实整体上出图效果更好&#xff0c;怎么办&#xff1f; 这篇文章就来给大家介绍一个在SDXL中创作A…

多线程环境下,HashMap 为什么会出现死循环?

引言&#xff1a;HashMap作为一个常用的键值对存储结构&#xff0c;其内部实现在不同的JDK版本中有所演变&#xff0c;但其基本原理始终是通过哈希算法和数组来实现快速查找和存储。我们将探讨HashMap在多线程环境下出现死循环的根本原因&#xff0c;深入分析其中的数据结构特点…

网络安全(完整)

WAPI鉴别及密钥管理的方式有两种&#xff0c;既基于证书和基于预共享密钥PSK。若采用基于证书的方式&#xff0c;整个国产包括证书鉴别、单播密钥协商与组播密钥通告&#xff1b;若采用预共享密钥方式&#xff0c;整个国产则为单播密钥协商与组播密钥通告蠕虫利用信息系统缺陷&…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计&#xff0c;涵盖博客、电商网站及企业官网的布局实例&#xff0c;包括头部导航、内容区域、侧边栏、页脚…

国产24位I2S输入+192kHz立体声DAC音频数模转换器CJC4344

CJC4344是一款立体声数模转换芯片&#xff0c;内含插值滤波器、multi bit数模转换器、输出模拟滤波器。CJC4344系列支持大部分的音频数据格式。CJC4344基于一个带线性模拟低通滤波器的四阶multi-bitΔ-Σ调制器&#xff0c;而且本芯片可以通过检测信号频率和主时钟频率&#xf…

新能源汽车的能源动脉:中国星坤汽车电缆在新能源汽车电气化中的应用!

随着新能源汽车行业的蓬勃发展&#xff0c;汽车电缆组件作为汽车电气系统的核心组成部分&#xff0c;其重要性日益凸显。中国星坤汽车电缆组件以其卓越的性能和创新技术&#xff0c;为汽车的电能传输、信号传递和控制提供了坚实的保障。本文将深入解析星坤汽车电缆组件的特性、…