当前位置: 首页 > news >正文

python 中面向对象编程:深入理解封装、继承和多态

在本章中,我们将深入探讨Python中的高级面向对象编程概念,包括封装、继承和多态。让我们开始吧!

目录

    • 面向对象简介
      • 类和实例
      • 属性和方法
      • 继承和多态
    • 高级面向对象概念
      • 私有变量
      • 使用 `@property`
      • 使用 `__slots__`
      • 类的特殊成员
        • `__doc__`
        • `__call__`
        • `__str__`
        • `__iter__`
        • `__getitem__`, `__setitem__`, `__delitem__`

面向对象简介

面向对象编程(OOP)是一种编程范式,它通过将数据和方法封装在对象中,使代码更加模块化和易于管理。通过这种方式,我们可以避免重复造轮子,提升代码的可维护性和可读性。
image.png

类和实例

在OOP中,类是对某类对象的抽象,而实例是类的具体对象。例如,我们可以定义一个Human类来抽象表示人,并通过实例化该类来创建具体的人对象。

class Human:def __init__(self, name, age):self.name = nameself.age = agedef hello(self):print(f"Hello, I'm {self.name}")person1 = Human("Yingshan", 25)
person2 = Human(name="Lee", age=23)person1.hello()  # 输出: Hello, I'm Yingshan
person2.hello()  # 输出: Hello, I'm Lee

image.png

属性和方法

类的属性是类中定义的数据,而方法是类中定义的函数。在上面的例子中,nameage是属性,hello是方法。
image.png

继承和多态

继承是OOP的核心概念之一,通过继承,我们可以创建一个新类,该类继承自现有的类,获得其所有属性和方法。例如,我们可以创建一个Animal类,然后让Human类继承自Animal类。
image.png

class Animal:def mobile(self):return "Yes, animals are mobile"class Human(Animal):def __init__(self, name, age):self.name = nameself.age = agedef hello(self):print(f"Hello, I'm {self.name}")human = Human("Yingshan", 25)
print(human.mobile())  # 输出: Yes, animals are mobile

多态允许我们通过父类引用来调用子类的方法。在Python中,这可以通过方法重写实现。例如:

class Animal:def mobile(self):return "Yes, this animal is mobile"class Human(Animal):def __init__(self, name, age):self.name = nameself.age = agedef hello(self):print(f"Hello, I'm {self.name}")def mobile(self):return "Yes, this person is mobile"human = Human("Yingshan", 25)
print(human.mobile())  # 输出: Yes, this person is mobile

高级面向对象概念

私有变量

在类中,通过在变量名前加双下划线,可以将变量设为私有变量,仅在类内部访问。

class Person:def __init__(self, name):self.__name = namedef get_name(self):return self.__nameperson = Person("XiaoYang")
print(person.get_name())  # 输出: XiaoYang
# print(person.__name)  # 会报错,无法直接访问私有变量

使用 @property

使用 @property 装饰器,我们可以将方法转换为属性,从而更自然地访问和修改类的属性。
image.png

class Person:def __init__(self, weight):self.__weight = weight@propertydef weight(self):return self.__weight@weight.setterdef weight(self, value):if value < 100:print("Too light!")elif value > 400:print("Too heavy!")else:self.__weight = valuep1 = Person(160)
print(p1.weight)  # 输出: 160
p1.weight = 450   # 输出: Too heavy!

使用 __slots__

为了限制实例的属性,我们可以使用 __slots__。这可以节省内存空间。
image.png

class Person:__slots__ = ('name', 'country')p1 = Person()
p1.name = "XiaoYang"
p1.country = "China"
# p1.weight = 160  # 会报错,`weight` 不在 `__slots__` 中

类的特殊成员

__doc__

__doc__ 表示类的文档字符串。

class Person:"""This is a person class."""def __init__(self, name):self.__name = nameprint(Person.__doc__)
__call__

通过定义 __call__ 方法,可以使对象变得可调用。

class Person:def __init__(self, name):self.__name = namedef __call__(self):print("Calling myself")yingshan = Person("Yingshan")
yingshan()  # 输出: Calling myself
__str__

__str__ 方法定义了对象的字符串表示。

class Person:def __init__(self, name):self.__name = namedef __str__(self):return f"This is {self.__name}"yingshan = Person("Yingshan")
print(yingshan)  # 输出: This is Yingshan
__iter__

通过定义 __iter__ 方法,可以将对象变为可迭代。

class Person:def __init__(self, names):self.__names = namesdef __iter__(self):return iter(self.__names)friends = Person(["Yingshan", "Mike", "Tim"])
for friend in friends:print(friend)  # 依次输出: Yingshan, Mike, Tim
__getitem__, __setitem__, __delitem__

这些方法用于索引操作。

class Person:def __init__(self):self.dic = {}def __setitem__(self, key, value):self.dic[key] = valuedef __getitem__(self, key):return self.dic[key]def __delitem__(self, key):del self.dic[key]obj = Person()
obj["name"] = "Yingshan"
print(obj["name"])  # 输出: Yingshan
del obj["name"]

通过面向对象编程,复杂的问题变得更易于解决。

希望这篇文章能帮助你更好地理解Python中的面向对象编程。Happy coding!

相关文章:

python 中面向对象编程:深入理解封装、继承和多态

在本章中&#xff0c;我们将深入探讨Python中的高级面向对象编程概念&#xff0c;包括封装、继承和多态。让我们开始吧&#xff01; 目录 面向对象简介类和实例属性和方法继承和多态 高级面向对象概念私有变量使用 property使用 __slots__类的特殊成员__doc____call____str____…...

OpenCV练习(2)图像校正

1、傅里叶变换 霍夫变换 直线 角度 旋转2、边缘检测 霍夫变换 直线角度 旋转3、四点透视 角度 旋转4、检测矩形轮廓 角度 旋转 1.目的 实现类似全能扫面王的图像校正功能 2. 基于轮廓提取和透射变换 基于轮廓提取和透射变换的矫正算法更适用于车牌、身份证、人民…...

Excel中的“点选输入”——次级下拉列表创建

在Excel中&#xff0c;用“数据验证”功能可以设置下拉列表&#xff0c;二级下拉列表需要设置公式。 (笔记模板由python脚本于2024年06月16日 18:36:37创建&#xff0c;本篇笔记适合经常使用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…...

基于 Spring AOP 实现安全检查

在现代应用程序中&#xff0c;安全性是一个至关重要的方面。通过对系统中的关键操作进行安全检查&#xff0c;可以有效防止未授权的访问和操作。Spring AOP&#xff08;面向切面编程&#xff09;提供了一种优雅的方式来实现安全检查&#xff0c;而无需修改业务逻辑代码。本文将…...

【MySQL】数据库事务详解

文章目录 前言1. 事务的定义2. 事务的四个特性2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3. 事务的并发问题3.1 脏读3.2 不可重复读3.3 幻读3.4 更新丢失 4. 事务的隔离级别5. 事务的使用结语 前言 假设我们现在需要操作数据库进行转账&#xff0c;A 给 B 转账 100 块钱&…...

ubuntu链接mysql

C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…...

QStyledItemDelegate 和 QItemDelegate 的作用

在Qt中&#xff0c;QStyledItemDelegate和QItemDelegate是用于自定义和控制项视图控件&#xff08;如QListView、QTableView、QTreeView&#xff09;中项的显示和编辑的委托类。它们提供了对项的外观和编辑行为的定制能力。尽管它们在功能上有相似之处&#xff0c;但它们之间有…...

3.任务的创建与删除

1.什么是任务&#xff1f; 任务可以理解为进程/线程&#xff0c;创建一个任务&#xff0c;就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务...

进程、CPU、MMU与PCB之间的关系

目录 进程与cpu&#xff08;中央处理器&#xff09; 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU&#xff08;内存管理单元&#xff09; mmu作用 cpu和mmu的关系 进程与PCB&#xff08;进程控制块&#xff09; PCB介绍与内部成员…...

代码随想录算法训练营Day50|1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列

最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 最长公共子序列 - 动态规划 Longest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili 本题和上一题718.最长重复子数组在很多方面相似&#xf…...

国家自然科学基金标书大全(2002-2024)

数据来源&#xff1a;在20世纪80年代初&#xff0c;为了促进中国的科技体制革新并改革科研资金分配机制&#xff0c;中国科学院的89位院士联名向党和国家领导人提出建议&#xff0c;设立了国家自然科学基金的设立。国自然基金自创立以来&#xff0c;根据国家发展科学技术方针、…...

Python代码打包成exe应用

目录 一、前期准备 二、Pyinstaller打包步骤 Pyinstaller参数详解 三、测试 Spec 文件相关命令 一、前期准备 &#xff08;1&#xff09;首先&#xff0c;我们需要确保你的代码可以在本地电脑上的pycharm正常运行成功。 &#xff08;2&#xff09;我们要先安装Pyinstalle…...

CesiumJS【Basic】- #016 多边形面渲染“花了”的问题

文章目录 多边形面渲染“花了”的问题1 目标2 问题代码3 修正后代码4 总结多边形面渲染“花了”的问题 1 目标 解决多边形的面“花了”的问题 2 问题代码 使用Cesium.PerInstanceColorAppearance渲染后出现色斑 import * as Cesium from "cesium";const viewer …...

qt 开发对信号槽进行二次封装,实现信号槽管理接口。

最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高 使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果, 想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一…...

本地项目上传到gitee

本地项目通过webstorm上传到gitee 1.登录gitee选择新建仓库 2.输入新建仓库的名字&#xff08;名字与本地项目名一致&#xff09; 3.复制链接 4.找到本地项目&#xff0c;选中地址输入cmd打开命令提示框 5.输入git init初始化git&#xff0c;生成.git文件 6.webstorm中打开项目…...

ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!

在当今数字化办公时代&#xff0c;一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件&#xff0c;凭借其全面的功能、优异的性能和出色的用户体验&#xff0c;为用户带来了超越想象的办公体验。下面&#xff0c;我们将对ON…...

中介子方程三十四

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXK…...

最新Sublime Text软件安装包分享(汉化版本)

Sublime Text 是一款广受欢迎的跨平台文本编辑器&#xff0c;专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称&#xff0c;深受开发者和写作者的喜爱。 一、下载地址 链接&#xff1a;https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…...

AI-智能体基础设施

个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示&#xff0c;即&#xff1a;Agent大模型&#xff08;LLM&#xff09;记忆&#xff08;Memory&#xff09;主动规划&#xff08;Planning&#xff09;工具使用&#xff08;Tool Use&#xff09;。基于该公式&am…...

【docker】docker启动neo4j,并配置内存

注意下&#xff1a;--volume宿主机目录:/data 和 --publish宿主机port:7474 --publish宿主机port:7687 docker run -d \ --publish9801:7474 --publish9802:7687 \ --env NEO4J_AUTHneo4j/passwd \ --volume/opt/docker/data/vol-data/neo4j4.2:/data \ --restart always \ --…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...