Python入门12:面向对象的三大特征与高级特性详解
面向对象编程(OOP)是Python编程中非常重要的一部分,它通过封装、继承和多态这三大特征,帮助我们更好地组织和管理代码。除此之外,Python还提供了一些其他特性,如类属性、类方法和静态方法,进一步增强了面向对象编程的灵活性和功能性。本文将详细介绍这些特性,并通过代码示例帮助你更好地理解。
一、面向对象有三大特征
1、封装
1.1、封装中的私有属性和私有⽅法
1.2、私有属性
class Person:def __init__(self, name, age):self.__name = name # 私有属性self.__age = age # 私有属性def get_name(self): # 公共方法,用于访问私有属性return self.__namedef set_name(self, name): # 公共方法,用于修改私有属性self.__name = namedef get_age(self):return self.__agedef set_age(self, age):if age > 0:self.__age = ageelse:print("年龄不能为负数!")# 使用
person = Person("张三", 20)
print(person.get_name()) # 访问私有属性
person.set_name("李四") # 修改私有属性
print(person.get_name())
运行结果:
对私有属性间接的进行访问:
class People:def __init__(self, name, age):self.__name = nameself.__age = agedef tell_info(self):print('name:<%s> age:<%s>' % (self.__name, self.__age))def set_info(self, name, age):if not isinstance(name, str):print('名字必须是字符串类型')returnif not isinstance(age, int):print('年龄必须是数字类型')returnself.__name = nameself.__age = age# 创建实例并调用方法
p = People('jack', 38)
p.tell_info() # 输出:name:<jack> age:<38>p.set_info('jennifer', 18)
p.tell_info() # 输出:name:<jennifer> age:<18>p.set_info(123, 35) # 输出:名字必须是字符串类型
p.tell_info() # 输出:name:<jennifer> age:<18>
运行结果:
1.3、私有方法
class ATM:def __card(self):print('插卡')def __auth(self):print('用户认证')def __input(self):print('输入取款金额')def __print_bill(self):print('打印账单')def __take_money(self):print('取款')# 定义一个对外提供服务的公共方法def withdraw(self):self.__card()self.__auth()self.__input()self.__print_bill()self.__take_money()# 创建实例并调用公共方法
atm = ATM()
atm.withdraw()
运行结果:
1.4、封装的意义
-
数据隐藏:通过将属性设置为私有(使用双下划线
__
),可以防止外部直接访问和修改对象的内部数据。 -
接口暴露:通过提供公共方法(如
get_xx
和set_xx
),可以控制外部对私有属性的访问和修改。
2、继承
2.1、什么是继承?
继承是面向对象编程的另一个重要特征。它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用和扩展。
继承几个基本概念:
2.2、继承的基本语法
class B(object):pass
class A(B):pass
a = A()
a.B中的所有公共属性
a.B中的所有公共⽅法
2.3、单继承
单继承是指一个子类只能继承一个父类。通过继承,子类可以复用父类的属性和方法,同时还可以扩展自己的属性和方法。
class Animal:def __init__(self, name):self.name = namedef speak(self):print(f"{self.name} 在叫")class Dog(Animal): # 继承自Animal类def bark(self):print(f"{self.name} 汪汪汪!")# 实例化Dog对象
dog = Dog("旺财")
dog.speak() # 调用父类方法
dog.bark() # 调用子类方法
运行结果:
2.4、单继承的传递性
class C(object):def func(self):print('我是C类中的相关⽅法func')class B(C):passclass A(B):passa = A()
a.func()
运行结果:
2.5、多继承
Python支持多继承,即一个子类可以同时继承多个父类。虽然多继承允许我们同时继承⾃多个类,但是实际开发中,应尽量避免使⽤多继承,因为如果两个类中出现了相同的属性和⽅法就会产⽣命名冲突。
class you_car(object):y_name = "油车"def use_you(self):print("我是油车,我使用的是汽油驱动!!!")class dian_car(object):d_name = "电车"def use_dian(self):print("我是电车,我使用的是电力驱动")class hunhe_car(you_car,dian_car):yd_name = "油电混动"def use_hunhe(self):print("我是油电混懂,我既能够使用汽油驱动,又能够使用电力驱动")hh = hunhe_car()
hh.use_hunhe()
hh.use_you()
hh.use_dian()
print(hh.y_name)
print(hh.d_name)
print(hh.yd_name)
运行结果:
2.6、⼦类扩展:重写⽗类属性和⽅法

# 重写2:类⽅法的调⽤顺序,当我们在⼦类中重构⽗类的⽅法后,Cat⼦类的实例先会在⾃⼰的类 Cat 中查找该⽅法,
# 当找不到该⽅法时才会去⽗类 Animal 中查找对应的⽅法。
class Animal():def call(self):print("我是动物类中叫方法")class Cat(Animal):# 自定义def cat_call(self):print("我是猫类中喵喵叫的方法")# 重写方法def call(self):print("我是猫类中喵喵叫的方法")
# 父类中的方法功能不够,在子类中的解决方法:
# 1、重写
# 2、定义一个新的方法
c = Cat()
c.call()
运行结果:
2.7、super()调⽤⽗类属性和⽅法
在子类中,可以通过super()
函数调用父类的方法,尤其是在重写父类方法时,仍然希望保留父类的行为。在Python3以 后版本中,调⽤⽗类的属性和⽅法我们只需要使⽤ super().属性 或 super().⽅法名() 就可以完 成调⽤了。
class Car:def __init__(self, brand, model):self.brand = brand # 品牌self.model = model # 型号def run(self):print(f"{self.brand} {self.model} 在行驶!")class ElectricCar(Car):# 重写构造函数def __init__(self, brand, model, battery):super().__init__(brand, model) # 调用父类的构造方法self.battery = battery# 重写run方法def run(self):super().run() # 调用父类的run方法print(f"在以 {self.battery} 千米每小时的速度在行驶")tesla = ElectricCar("Tesla", "Model S", 75)
tesla.run()
运行结果:
2.8.MRO属性或MRO⽅法:⽅法解析顺序
当多个父类中有同名方法时,Python 需要确定调用哪个父类的方法,这就涉及到方法解析顺序(MRO)。Python 使用 C3 线性化算法来计算 MRO。可以使用__mro__
属性或mro()
方法查看类的 MRO。
class A:def method(self):print("Method from A")class B(A):def method(self):print("Method from B")class C(A):def method(self):print("Method from C")class D(B, C):pass# 查看D类的MRO
print(D.__mro__)# 创建D类的实例
d = D()
# 调用method方法
d.method()
运行结果:

class Parent1:def __init__(self):print("Parent1 __init__")class Parent2:def __init__(self):print("Parent2 __init__")class Child(Parent1, Parent2):def __init__(self):# 调用父类的__init__方法super().__init__()print("Child __init__")# 创建Child类的实例
child = Child()
print(Child.__mro__)
运行结果:
3、多态
3.1、什么是多态?
3.2多态原理图
3.3、多态代码的实现
# ⽗类Fruit
class Fruit(object):def makejuice(self):print('i can make juice')# ⼦类:苹果
class Apple(Fruit):# 重写⽗类⽅法def makejuice(self):print('i can make apple juice')# ⼦类:⾹蕉
class Banana(Fruit):# 重写⽗类⽅法def makejuice(self):print('i can make banana juice')# ⼦类:橘⼦
class Orange(Fruit):# 重写⽗类⽅法def makejuice(self):print('i can make orange juice')# 定义⼀个公共接⼝(专⻔⽤于实现榨汁操作)
def service(obj):# obj要求是⼀个实例化对象,可以传⼊苹果对象/⾹蕉对象obj.makejuice()# 调⽤公共⽅法
service(Orange())
运行结果:
3.4、在Python中还有哪些多态的案例呢?
# 数值相加
print(1 + 2) # 输出:3# 字符串拼接
print("Hello" + " World") # 输出:Hello World# 列表合并
print([1, 2] + [3, 4]) # 输出:[1, 2, 3, 4]
二、面向对象的其他高级特性
1、类属性
类属性是属于类本身的属性,而不是类的实例。类属性被该类的所有实例对象所共享。
class Person(object):# 定义类属性count,⽤于记录⽣成的Person类对象的个数count = 0# 定义⼀个__init__魔术⽅法,⽤于进⾏初始化操作def __init__(self, name):self.name = name# 对count类属性进⾏+1操作,⽤于记录这个Person类⼀共⽣成了多少个对象Person.count += 1# 1、实例化对象p1
p1 = Person('Tom')
p2 = Person('Harry')
p3 = Person('Jennifer')# 2、在类外部输出类属性
print(f'我们共使⽤Person类⽣成了{Person.count}个实例对象')
运行结果:
2、类方法
class Tool(object):# 定义⼀个类属性countcount = 0# 定义⼀个__init__初始化⽅法def __init__(self, name):self.name = nameTool.count += 1# 封装⼀个类⽅法:专⻔实现对Tool.count类属性进⾏操作@classmethod # 声明为类⽅法,⽤于对类属性进⾏操作def get_count(cls): # cls代表类对象print(f'我们使⽤Tool类共实例化了{cls.count}个⼯具')t1 = Tool('斧头')
t2 = Tool('榔头')
t3 = Tool('铁锹')Tool.get_count()
运行结果:
3、静态方法
静态方法既不操作实例属性,也不操作类属性。它通常用于实现与类相关的工具函数。
class Game:@staticmethoddef menu():print("1. 开始游戏")print("2. 游戏暂停")print("3. 退出游戏")# 调用静态方法
Game.menu()
三、总结
面向对象编程的三大特征——封装、继承和多态,是Python编程中非常重要的概念。通过封装,我们可以隐藏对象的内部实现细节;通过继承,我们可以复用和扩展代码;通过多态,我们可以编写更加通用和灵活的代码。此外,Python还提供了类属性、类方法和静态方法等高级特性,进一步增强了面向对象编程的功能性。
希望本文能帮助你更好地理解Python面向对象编程的核心概念,并在实际开发中灵活运用这些特性!
相关文章:

Python入门12:面向对象的三大特征与高级特性详解
面向对象编程(OOP)是Python编程中非常重要的一部分,它通过封装、继承和多态这三大特征,帮助我们更好地组织和管理代码。除此之外,Python还提供了一些其他特性,如类属性、类方法和静态方法,进一步…...

动态链接器(九):.init和.init_array
ELF文件中的.init和.init_array段是程序初始化阶段的重要组成部分,用于在main函数执行前完成必要的初始化操作。 1 .init段和.init_array 段 1.1 作用 .init段包含编译器生成的初始化代码,通常由运行时环境(如C标准库的启动例程࿰…...

Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入
作者:来自 Elastic Dai Sugimori 了解稀疏向量嵌入,理解它们的作用/含义,以及如何使用它们实现语义搜索。 Elasticsearch 提供语义搜索功能,允许用户使用自然语言进行查询并检索相关信息。为此,目标文档和查询必须首先…...

安宝特方案 | 电力行业的“智能之眼”,AR重新定义高效运维!
引言: 电力行业正经历智能化变革,安宝特AR数字化工作流以四大核心优势,为电力企业打造全场景智慧运维方案! 四大颠覆性功能,直击行业痛点 1、高度自定义作业流程 支持图文指引、语音播报、AI实时识别(如…...

【落羽的落羽 数据结构篇】树、二叉树
文章目录 一、树1. 树的概念和结构2. 树的相关术语 二、二叉树1. 概念与结构2. 满二叉树3. 完全二叉树4. 二叉树的性质5. 二叉树的存储结构 一、树 1. 树的概念和结构 之前我们学习了线性表,今天我们再来接触一种全新的数据结构——树。 树是一种非线性的数据结构…...

[回顾]从原型链视角解读Vue底层实现Vue VueCompoent VM VC关系
从原型链视角解读VueComponent与Vue关系 原型链 根据,原型链涉及三个关键属性:__proto__是所有对象的私有属性,指向原型链的第一个元素;prototype是函数的属性,实例对象不拥有它;constructor指向构造函数。提到原型链是JS中实现继承的机制,通过属性链式查找属性,直到…...

springcloud nacos 整合seata解决分布式事务
文章目录 nacos安装Mysql5.7安装及表初始化seata server安装下载并解压seata安装包在conf文件夹修改file.conf文件向本地数据库导入seata需要的表修改registry.conf文件将seata配置信息添加到nacos配置中心启动seata server springcloud整合seata测试流程正常下单流程扣减库存失…...

【算法系列】快速排序详解
文章目录 快速排序的多种实现方式1. 基本快速排序(Lomuto 分区方案)1.1 基本原理1.2 步骤1.3 Java 实现示例 2. Hoare 分区方案2.1 基本原理2.2 步骤2.3 Java 实现示例 3. 三数取中法3.1 基本原理3.2 步骤3.3 Java 实现示例 4. 尾递归优化4.1 基本原理4.…...
神经网络发展简史:从感知机到通用智能的进化之路
引言 神经网络作为人工智能的核心技术,其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角,梳理神经网络发展的五大关键阶段,结合具象化比喻和经典案例,为读者呈现一幅清晰的AI算法发展图谱。 一…...

C语言番外篇(4)--------->goto语句
在C语言中,有一个很特殊的语法,这就是goto语句。goto用于实现同一函数的跳转,goto后面会有一个标志,执行goto语句时,就会跳转到标志的位置。 一、goto语句的语法 (1)goto在前,标志…...

AI 编码 2.0 分析、思考与探索实践:从 Cursor Composer 到 AutoDev Sketch
在周末的公司【AI4SE 效能革命与实践:软件研发的未来已来】直播里,我分享了《AI编码工具 2.0 从 Cursor 到 AutoDev Composer》主题演讲,分享了 AI 编码工具 2.0 的核心、我们的思考、以及我们的 AI 编码工具 2.0 探索实践。 在这篇文章中&am…...
Linux与自动化的基础
Linux简介 Linux是一种开源的类Unix操作系统,广泛应用于服务器、桌面和嵌入式设备。常见的Linux发行版包括 Ubuntu、CentOS 和 Debian,它们各有特色,但都以稳定性和安全性著称。 与图形界面相比,Linux的**命令行界面(…...

安全开发-环境选择
文章目录 个人心得虚拟机选择ubuntu 22.04python环境选择conda下载使用: 个人心得 在做开发时配置一个专门的环境可以使我们在开发中的效率显著提升,可以避免掉很多环境冲突的报错。尤其是python各种版本冲突,还有做渗透工具不要选择windows…...

【算法设计与分析】(一)介绍算法与复杂度分析
【算法设计与分析】(一)介绍算法与复杂度分析 前言一、什么是算法?二、算法的抽象机制三、描述算法四、复杂度分析4.1 时间复杂度4.2 空间复杂度 前言 从搜索引擎的高效检索,到推荐系统的个性化推荐,再到人工智能领域…...
SurfaceFlinger代码笔记
drawLayers是做client合成,合成完以后的buffer会放在RenderSurface里 FrameBufferSurface里的buffer是通过setClientTarget给到HWC的(HWC应该给client合成的buffer留了一个slot) Output.cpp这个文件非常关键,代表着具体一个Display的操作 d…...

2025 PHP授权系统网站源码
2025 PHP授权系统网站源码 安装教程: PHP7.0以上 先上传源码到服务器,然后再配置伪静态, 访问域名根据操作完成安装, 然后配置伪静态规则。 Ngix伪静态规则: location / { if (!-e $request_filename) { rewrite …...
Fisher散度:从信息几何到机器学习的隐藏利器
Fisher散度:从信息几何到机器学习的隐藏利器 在机器学习和统计学中,比较两个概率分布的差异是常见任务,比如评估真实分布与模型预测分布的差距。KL散度(Kullback-Leibler Divergence)可能是大家熟悉的选择,…...

深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )
🍨 本文为🔗365天深度学习训练营 中的学习记录博客Y1中的内容 🍖 原作者:K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金,恶意揣测偷懒用假的结果冒充真实打卡记录,在提出能够拿到视频录像…...

实体机器人在gazebo中的映射
这一部分目的是将真实的机器人映射到gazebo中,使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。 真实机器人的型号的wheeltec旗下的mini_mec。 一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip 找到对应的包 拷贝到工作空间下 在原有…...
【学习笔记】Kubernetes
一、 概览 Kubernetes 提供了一个抽象层,是用户可以在屋里或虚拟环境中部署容器化应用,提供以容器为中心的基础架构。 Kubernetes的控制平面和工作节点都有什么组建? 分别有什么作用? 1.1 Kubernetes控制平面和工作节点的组件及…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...