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控制平面和工作节点的组件及…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

