python 中面向对象编程:深入理解封装、继承和多态
在本章中,我们将深入探讨Python中的高级面向对象编程概念,包括封装、继承和多态。让我们开始吧!
目录
- 面向对象简介
- 类和实例
- 属性和方法
- 继承和多态
- 高级面向对象概念
- 私有变量
- 使用 `@property`
- 使用 `__slots__`
- 类的特殊成员
- `__doc__`
- `__call__`
- `__str__`
- `__iter__`
- `__getitem__`, `__setitem__`, `__delitem__`
面向对象简介
面向对象编程(OOP)是一种编程范式,它通过将数据和方法封装在对象中,使代码更加模块化和易于管理。通过这种方式,我们可以避免重复造轮子,提升代码的可维护性和可读性。

类和实例
在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

属性和方法
类的属性是类中定义的数据,而方法是类中定义的函数。在上面的例子中,name和age是属性,hello是方法。

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

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 装饰器,我们可以将方法转换为属性,从而更自然地访问和修改类的属性。

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__。这可以节省内存空间。

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 中面向对象编程:深入理解封装、继承和多态
在本章中,我们将深入探讨Python中的高级面向对象编程概念,包括封装、继承和多态。让我们开始吧! 目录 面向对象简介类和实例属性和方法继承和多态 高级面向对象概念私有变量使用 property使用 __slots__类的特殊成员__doc____call____str____…...
OpenCV练习(2)图像校正
1、傅里叶变换 霍夫变换 直线 角度 旋转2、边缘检测 霍夫变换 直线角度 旋转3、四点透视 角度 旋转4、检测矩形轮廓 角度 旋转 1.目的 实现类似全能扫面王的图像校正功能 2. 基于轮廓提取和透射变换 基于轮廓提取和透射变换的矫正算法更适用于车牌、身份证、人民…...
Excel中的“点选输入”——次级下拉列表创建
在Excel中,用“数据验证”功能可以设置下拉列表,二级下拉列表需要设置公式。 (笔记模板由python脚本于2024年06月16日 18:36:37创建,本篇笔记适合经常使用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:http…...
基于 Spring AOP 实现安全检查
在现代应用程序中,安全性是一个至关重要的方面。通过对系统中的关键操作进行安全检查,可以有效防止未授权的访问和操作。Spring AOP(面向切面编程)提供了一种优雅的方式来实现安全检查,而无需修改业务逻辑代码。本文将…...
【MySQL】数据库事务详解
文章目录 前言1. 事务的定义2. 事务的四个特性2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3. 事务的并发问题3.1 脏读3.2 不可重复读3.3 幻读3.4 更新丢失 4. 事务的隔离级别5. 事务的使用结语 前言 假设我们现在需要操作数据库进行转账,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中,QStyledItemDelegate和QItemDelegate是用于自定义和控制项视图控件(如QListView、QTableView、QTreeView)中项的显示和编辑的委托类。它们提供了对项的外观和编辑行为的定制能力。尽管它们在功能上有相似之处,但它们之间有…...
3.任务的创建与删除
1.什么是任务? 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务...
进程、CPU、MMU与PCB之间的关系
目录 进程与cpu(中央处理器) 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU(内存管理单元) mmu作用 cpu和mmu的关系 进程与PCB(进程控制块) PCB介绍与内部成员…...
代码随想录算法训练营Day50|1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列
最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 最长公共子序列 - 动态规划 Longest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili 本题和上一题718.最长重复子数组在很多方面相似…...
国家自然科学基金标书大全(2002-2024)
数据来源:在20世纪80年代初,为了促进中国的科技体制革新并改革科研资金分配机制,中国科学院的89位院士联名向党和国家领导人提出建议,设立了国家自然科学基金的设立。国自然基金自创立以来,根据国家发展科学技术方针、…...
Python代码打包成exe应用
目录 一、前期准备 二、Pyinstaller打包步骤 Pyinstaller参数详解 三、测试 Spec 文件相关命令 一、前期准备 (1)首先,我们需要确保你的代码可以在本地电脑上的pycharm正常运行成功。 (2)我们要先安装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.输入新建仓库的名字(名字与本地项目名一致) 3.复制链接 4.找到本地项目,选中地址输入cmd打开命令提示框 5.输入git init初始化git,生成.git文件 6.webstorm中打开项目…...
ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!
在当今数字化办公时代,一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件,凭借其全面的功能、优异的性能和出色的用户体验,为用户带来了超越想象的办公体验。下面,我们将对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 是一款广受欢迎的跨平台文本编辑器,专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称,深受开发者和写作者的喜爱。 一、下载地址 链接:https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…...
AI-智能体基础设施
个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示,即:Agent大模型(LLM)记忆(Memory)主动规划(Planning)工具使用(Tool Use)。基于该公式&am…...
【docker】docker启动neo4j,并配置内存
注意下:--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 \ --…...
城通网盘直连解析终极解决方案:告别限速,实现全速下载的完整指南
城通网盘直连解析终极解决方案:告别限速,实现全速下载的完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘的龟速下载而烦恼吗?每次下载大文件都…...
基于hexascribe/chatbot-builder框架的对话机器人开发实战指南
1. 项目概述:一个面向开发者的对话机器人构建框架最近在GitHub上看到一个挺有意思的项目,叫hexascribe/chatbot-builder。乍一看名字,你可能会觉得这又是一个“又一个聊天机器人框架”,市面上类似的工具确实不少,从早期…...
别再只盯着PWM了!手把手教你为你的Arduino项目选择合适的DCDC调制方式(PFM/PWM/Burst Mode全解析)
别再只盯着PWM了!手把手教你为你的Arduino项目选择合适的DCDC调制方式(PFM/PWM/Burst Mode全解析) 当你为Arduino项目挑选电源模块时,是否曾被数据手册上PWM、PFM、Burst Mode这些术语搞得一头雾水?我曾在一个低功耗气…...
从架构到应用:DNNGP、DeepGS与DLGWAS三大基因预测模型深度剖析
1. 基因预测模型的崛起与挑战 基因组学研究正在经历一场由AI驱动的革命。过去十年间,随着高通量测序技术的普及,生物医学领域积累了海量的基因数据,但传统统计方法在处理复杂性状预测时逐渐显得力不从心。正是在这样的背景下,DNNG…...
如何用Python自动化脚本轻松抢到大麦网演唱会门票
如何用Python自动化脚本轻松抢到大麦网演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪演唱会门票而烦恼吗?面对秒光的票源和昂贵的黄牛票,手动…...
STM32F407霸天虎开发板I2C驱动OLED避坑指南:从CubeMX配置到显示中文全流程
STM32F407霸天虎开发板I2C驱动OLED避坑指南:从CubeMX配置到显示中文全流程 在嵌入式开发中,OLED显示屏因其高对比度、低功耗和轻薄特性成为许多项目的首选显示方案。本文将深入探讨如何基于STM32F407霸天虎开发板,通过HAL库和I2C接口高效驱动…...
PX4飞控IMU频率上不去?手把手教你用MAVLink命令和SD卡配置文件,稳定提升到200Hz
PX4飞控IMU频率优化实战:从原理到200Hz稳定配置 引言 在无人机开发领域,IMU数据的高频采集对于飞行控制精度至关重要。许多开发者在使用PX4飞控时都遇到过这样的困扰:默认的50Hz IMU频率无法满足高动态飞行需求,而手动调整后要么…...
为什么你需要Scroll Reverser?macOS滚动方向独立控制的终极解决方案
为什么你需要Scroll Reverser?macOS滚动方向独立控制的终极解决方案 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 在macOS上使用触控板和鼠标时,你是否…...
Page Assist终极指南:3步安装本地AI浏览器助手,开启智能网页浏览新时代
Page Assist终极指南:3步安装本地AI浏览器助手,开启智能网页浏览新时代 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist 想…...
技术Leader的“预期管理”艺术:承诺80分,交付100分
在软件测试领域,我们擅长用技术手段管理缺陷、管理风险,却常常忽略一项更重要的软技能——管理上级的预期。许多测试Leader带着一身硬本领走上管理岗位,却在“预期差”上栽了跟头:明明团队加班加点测出了所有P0级缺陷,…...
