python面向对像之第二次笔记

python面向对像

  • 一、面向对象的三大特性
    • 面向对象包含3大主要特性:
      • 封装
      • 私有成员
      • 继承
        • 复写
      • pass关键字
      • 多态
  • 总结

---

一、面向对象的三大特性

面向对象包含3大主要特性:

  • 封装

    封装是面向对象编程中的一个重要概念,它指的是将数据(属性)和操作数据的方法(方法)捆绑在一起,以实现数据的隐藏和保护。通过封装,我们可以控制对象内部数据的访问权限,只允许通过对象的接口(方法)来访问和修改数据,而不直接暴露数据给外部。

    封装表示的是,将现实世界事物的属性行为 封装到类中,描述为:

    • 成员变量
    • 成员方法

    从而完成程序对现实世界事物的描述。

    在Python中,封装通常通过定义类来实现。类中的属性可以用于存储数据,而方法可以用于操作这些数据。通过使用访问控制符(例如,在属性名前加上一个下划线“_”),我们可以约定哪些属性和方法是公开的,哪些是私有的,从而实现封装的效果。

    下面是一个简单的示例,演示了如何在Python中实现封装:

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 = age# 创建一个Person对象
person = Person("Alice", 30)# 使用公开的方法访问和修改属性
print(person.get_name())  # 输出:Alice
person.set_age(25)
print(person.get_age())   # 输出:25# 尝试直接访问属性(不推荐)
print(person._name)  # 输出:Alice

私有成员

在Python中,以双下划线 __ 开头的属性或方法被视为私有成员(private member)。私有成员的存在是为了实现封装,防止外部直接访问和修改类内部的属性或方法。尽管在语法上可以直接访问私有成员,但Python通过名称修饰来对其进行保护。

私有属性通常也被称为私有成员变量。在面向对象编程中,私有属性用来表示只能在类的内部访问或修改的成员变量。这种封装性可以确保类的内部状态不会被外部直接访问或修改,而是通过公共的接口(例如公有方法)来进行操作。

当一个名称以双下划线开头时,Python会自动对这个名称进行变换,将其重命名为 _ClassName__name 的形式,其中 ClassName 是包含私有成员的类名。这种变换使得外部无法直接访问私有成员,而只能通过特定的方式来间接访问。因此,私有属性和私有成员变量通常可以互换使用,它们都指代类的内部状态,只能通过类内部的方法进行访问和修改。

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。

定义私有成员的方式非常简单,只需要:

私有成员变量:变量名以__开头(2个下划线)
私有成员方法:方法名以__开头(2个下划线)

即可完成私有成员的设置

class Car:def __init__(self, make, model, year):self.__make = make      # 私有属性self.__model = model    # 私有属性self.__year = year      # 私有属性def get_make(self):return self.__makedef set_make(self, make):self.__make = makedef __update_year(self):self.__year += 1print(f"Year updated to {self.__year}")def increase_year(self):self.__update_year()# 创建一个 Car 实例
my_car = Car("Toyota", "Corolla", 2022)# 尝试访问私有属性(不推荐)
# 这里实际上访问的是名称经过变换后的属性
print(my_car._Car__make)  # 输出:Toyota# 使用公开的方法访问和修改私有属性
print(my_car.get_make())   # 输出:Toyota
my_car.set_make("Honda")
print(my_car.get_make())   # 输出:Honda# 尝试调用私有方法(不推荐)
# 这里实际上调用的是名称经过变换后的方法
my_car._Car__update_year()  # 输出:Year updated to 2023# 使用公开方法调用私有方法
my_car.increase_year()  # 输出:Year updated to 2024

在上面的示例中,__make__model__year 被定义为私有属性,外部无法直接访问。我们使用 get_makeset_make 方法来间接访问和修改私有属性。同时,__update_year 被定义为私有方法,外部无法直接调用,但我们通过 increase_year 方法间接调用私有方法来更新年份。

通过这种方式,我们可以保护类的内部数据和行为,确保良好的封装性和安全性。

注意:

1. 私有方法无法直接被类对象使用 

在这里插入图片描述
在这里插入图片描述

2. 私有变量无法赋值,也无法获取值

在这里插入图片描述

  • 继承

在面向对象编程中,继承是一种重要的概念,它允许一个类(称为子类)继承另一个类(称为父类)的属性和方法(不含私有)。子类可以使用父类的所有公共成员,并且可以根据需要添加自己的属性和方法。这种机制使得代码的复用变得更加容易,并提供了一种层次化的结构来组织和管理类。

在Python中,通过在定义子类时将父类作为参数传递给子类,即可实现继承。子类可以继承父类的属性和方法(不含私有),并可以添加新的属性和方法,也可以对父类的方法进行重写(覆盖)以改变其行为。

下面举一个简单的示例来说明继承的概念:

# 定义一个父类
class Animal:def __init__(self, name):self.name = namedef make_sound(self):pass# 定义一个子类,继承自 Animal
class Dog(Animal):def make_sound(self):return "Woof!"# 定义另一个子类,也继承自 Animal
class Cat(Animal):def make_sound(self):return "Meow!"# 创建 Dog 对象并调用方法
my_dog = Dog("Buddy")
print(my_dog.name)      # 输出:Buddy
print(my_dog.make_sound())  # 输出:Woof!# 创建 Cat 对象并调用方法
my_cat = Cat("Kitty")
print(my_cat.name)      # 输出:Kitty
print(my_cat.make_sound())  # 输出:Meow!

在上面的示例中,Animal 类是父类,DogCat 类是子类。子类 DogCat 继承了父类 Animalname 属性和 make_sound 方法。注意,在子类中可以重写父类的方法,以实现特定于子类的行为。这里的 make_sound 方法在两个子类中被重写,分别返回狗的吠声和猫的喵声。

这样,我们就通过子类继承了父类的属性和方法,并且可以根据需要添加特定于子类的功能,实现了代码的复用和扩展。


当一个类继承自单个父类时,称为单继承;而当一个类同时继承自多个父类时,称为多继承。Python支持多继承,允许一个子类继承自多个父类,从而获得多个父类的属性和方法。


单继承示例:

在这里插入图片描述

# 定义一个父类
class Animal:def __init__(self, name):self.name = namedef make_sound(self):pass# 定义一个子类,继承自 Animal
class Dog(Animal):def make_sound(self):return "Woof!"# 创建 Dog 对象并调用方法
my_dog = Dog("Buddy")
print(my_dog.name)      # 输出:Buddy
print(my_dog.make_sound())  # 输出:Woof!

在这个单继承示例中,Dog 类继承自 Animal 类,只有一个父类。

多继承示例:

在这里插入图片描述

# 定义两个父类
class A:def method_a(self):return "Method A"class B:def method_b(self):return "Method B"# 定义一个子类,同时继承自 A 和 B
class C(A, B):def method_c(self):return "Method C"# 创建 C 对象并调用方法
my_c = C()
print(my_c.method_a())  # 输出:Method A
print(my_c.method_b())  # 输出:Method B
print(my_c.method_c())  # 输出:Method C

在这个多继承示例中,C 类同时继承自 A 和 B 两个父类,可以使用两个父类的方法。需要注意的是,在多继承中可能出现方法名冲突的情况,此时可以通过方法解析顺序(MRO)来确定调用哪个父类的方法。

多继承注意事项

多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
即:先继承的保留,后继承的被覆盖

class A:def method(self):return "A"class B:def method(self):return "B"class C(A, B):passc = C()
print(c.method())  # 输出:A
复写

在面向对象编程中,方法的覆盖(Override)或者称为复写(Overwrite),是指子类重新定义(覆盖)了从父类继承而来的方法,使得子类可以提供自己的实现。当子类中定义了一个与父类中同名的方法时,子类中的方法会覆盖父类中的方法,从而改变了原有的方法行为。

复写通常用于子类需要定制特定行为而不是完全继承父类方法的情况。通过复写,子类可以根据自身的需要重写父类的方法,实现多态性和定制化。

子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。

即:在子类中重新定义同名的属性或方法即可。

以下是一个简单的示例来说明复写的概念:

class Animal:def speak(self):print("Animal speaks")class Dog(Animal):def speak(self):print("Dog barks")class Cat(Animal):def speak(self):print("Cat meows")dog = Dog()
cat = Cat()dog.speak()  # 输出:Dog barks
cat.speak()  # 输出:Cat meows

在这个示例中,Animal 类定义了一个 speak 方法,而 DogCat 类分别继承自 Animal 类并复写了 speak 方法。当调用 speak 方法时,根据对象的类型不同,会执行相应子类中的方法,而不是直接调用父类的方法,实现了方法的覆盖效果。

pass关键字

在 Python 中,pass 是一个空语句,用于在语法上需要语句但程序不需要执行任何操作的情况下进行占位。简单来说,pass 关键字表示什么也不做,只是作为占位符存在,保持语法结构的完整性。

常见的用途包括:

占位: 在代码中暂时不做任何操作,但又需要保持语法结构完整时使用 pass。

占位函数或类: 在定义函数或类时,暂时不添加具体实现,可以使用 pass 作为占位符,避免出现语法错误。

例如:

# 定义一个空函数
def my_function():pass# 定义一个空类
class MyClass:pass# 使用 pass 占位
if condition:pass
else:do_something()

在上述示例中,pass 的作用是确保代码的完整性,即使暂时不需要实现任何功能,也能通过 pass 占位符保持代码的结构正确。

  • 多态

多态性通常与继承和方法覆盖(Override)相结合。当子类覆盖父类中的方法时,可以根据具体的子类对象来调用相应的方法,实现多态性。

多态性的优势包括:

代码复用: 可以通过多态性实现不同类之间共享相同的接口或方法,减少重复代码的编写。

灵活性: 可以根据具体对象的类型来动态调用方法,实现针对不同对象的定制化操作。

简化代码逻辑: 通过多态性可以将一组相关的操作抽象到同一个接口中,使得代码更加清晰易懂。

多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。

class Animal:def speak(self):print("Animal speaks")class Dog(Animal):def speak(self):print("Dog barks")class Cat(Animal):def speak(self):print("Cat meows")# 多态性的应用
def make_sound(animal):animal.speak()animal = Animal()
dog = Dog()
cat = Cat()make_sound(animal)  # 输出:Animal speaks
make_sound(dog)     # 输出:Dog barks
make_sound(cat)     # 输出:Cat meows

在这个示例中,make_sound 函数接受一个动物对象作为参数,并调用该对象的 speak 方法。根据传入的对象类型不同,会执行相应对象的 speak 方法,实现了多态性。这样,可以通过统一的接口来处理不同类型的对象,提高了代码的灵活性和可维护性。

---

总结

面向对象编程(OOP)的三大特性是封装、继承和多态。以下是对这三个特性的简要总结:

  1. 封装(Encapsulation):

    • 封装是指将数据和方法(行为)捆绑在一起,以防止外部直接访问对象的内部数据。
    • 通过封装,对象的内部细节被隐藏,只暴露必要的接口给外部使用,提高了安全性和代码的可维护性。
    • 封装还有助于实现信息隐藏,并且可以通过 getter 和 setter 方法来控制对属性的访问和修改。
  2. 继承(Inheritance):

    • 继承是指一个类(子类)可以获取另一个类(父类)的属性和方法,从而实现代码的重用。
    • 子类可以扩展或修改父类的功能,同时可以继承父类的行为,避免重复编写相同的代码。
    • 继承有助于建立类之间的层次关系,提高代码的可扩展性和灵活性。
  3. 多态(Polymorphism):

    • 多态是指同一种操作作用于不同的对象上时,可以产生不同的行为。
    • 多态性允许不同类的对象对同一个方法做出不同的响应,提高了代码的灵活性和可重用性。
    • 多态性通常与继承和方法覆盖(Override)相结合,使得代码可以根据具体对象的类型来动态调用方法,实现针对不同对象的定制化操作。

这三大特性共同构成了面向对象编程的基础,帮助开发人员设计出结构清晰、可维护、可扩展的代码,并提高了代码的重用性和可读性。

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

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

相关文章

STM32信息安全 1.2 课程架构介绍:芯片生命周期管理与安全调试

STM32信息安全 1.2 课程架构介绍:STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节,简单介绍下STM32H5芯片的生命周期和安全调试,具体课程大家可以观看STM32官方录制的课程,链接:1.2. 课程架构介绍&…

记一些有关Element Plus的样式修改

先记一个放着,后续慢慢补充。。。 一个 Vue 3 UI 框架 | Element Plus Radio 单选框 1、去除radio的圆圈 .box-radio {/deep/ .el-radio__input {display: none;} }

【QT入门】VS2019和QT Creator如何添加第三方模块

声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!) 往期回顾: 【QT入门】什么是qt,发展历史,特征,应用,QtCreator-CSDN博客 【QT入门】Windows平台…

模方信创版正式上线!支持水面一键修复、道路置平、纹理编辑...

现在国家大力推进信创国产化软硬件替代的政策背景下,大势智慧重磅发布模方信创版,以满足用户对在信创环境下进行实景三维模型修饰与编辑的需求。 模方信创版与重建大师信创版、DasViewer信创版一道,构筑起三维重建信创生态的“铁三角”&…

Unity PS5开发 天坑篇 之 DEVKit环境部署与系统升级02

上一篇各位大神们已经收到了SONY官方免费寄送的PS5开发机与测试机,恭喜大家成为SONY的开发者, 本篇继续PS5开发机的部署与开发套件使用。 一, PC安装PS5 SDK与系统升级 1. PC/PS5 SDK Manager下载安装包 登录开发者账号后,Development->Resources&a…

挑战杯 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…

Linux系统——测试磁盘IOPS性能

目录 引言 一、IOPS指标受到的影响因素 二、提高IOPS性能的措施 三、测试IOPS性能命令 1.fio工具 2.ioping工具 引言 磁盘IOPS是指磁盘每秒钟可以完成的输入/输出操作数。它是衡量磁盘性能的一个重要指标,尤其对于需要处理大量随机读写操作的应用程序&…

B010-springcloud alibaba 分布式事务 Seata

目录 分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务解决方案全局事务/两阶段提交可靠消息服务最大努力通知TCC事务 Seata介绍Seata实现分布式事务控制案例基本代码修改order微服务OrderSeataControllerOrderServiceImpl5注释容错相关代码ProductClient 修改…

C#语法基础

1. C#语言及其特点 C#是微软公司发布的一种面向对象、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的最高级程序设计语言。C#是一种安全的、稳定的、简单的、优雅的,由C和C衍生出来的面向对象的程序语言。它在继承C和C…

IPSEC VPN-详解原理

目录 IPSEC提供的安全服务 IPSEC协议簇 ​编辑 安全协议 1.传输模式 2. 隧道模式 AH ---鉴别头协议 AH提供的安全服务: AH头部 AH的保护范围 1.传输模式 2.隧道模式 ​编辑 ESP ---封装安全载荷协议 ESP提供的安全服务: ESP的头部 ESP的保护范围 1.传输…

数据库国产化探究及升级改造过程指导

一、背景 在信创“自主可控”的浪潮下,政企行业首当其冲,基于国产化信创的要求,本部门某业务后端应用也需要针对分析开源组件的风险和开源协议的商业应用限制;能用国产化替代的评估后尽可替代割接,本期针对传统数据库…

22、设计模式之状态模式(State)

一、什么是状态模式 状态模式是一种行为型设计模式。它允许对象在内部状态发生改变时改变它的行为,简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。 二、角色组成 上下文(Context&#xff0…

【Leetcode-54.螺旋矩阵】

题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入&#xff1…

从单机到分布式微服务,大文件校验上传的通用解决方案

一、先说结论 本文将结合我的工作实战经历,总结和提炼一种从单体架构到分布式微服务都适用的一种文件上传和校验的通用解决方案,形成一个完整的方法论。本文主要解决手段包括多线程、设计模式、分而治之、MapReduce等,虽然文中使用的编程语言…

外包干了3个月,技术明显进步。。。。。

在湖南的一个安静角落,我,一个普通的大专生,开始了我的软件测试之旅。四年的外包生涯,让我在舒适区里逐渐失去了锐气,技术停滞不前,仿佛被时间遗忘。然而,生活的转机总是在不经意间降临。 与女…

VMware安装Centos 7系统+设置共享文件夹+VMware Tools安装

文章目录 镜像下载地址下载页自己选择直接点击下边url下载 VMware环境1.新建虚拟机2.选择“自定义(高级)”,并点击【下一步】3.选择虚拟机硬件兼容性,并点击【下一步】4.选择“稍后安装操作系统”,并点击【下一步】5.选择操作系统版本&#x…

阿里云服务器地域怎么选?地域选择经验分享

阿里云服务器地域选择方法,如何选择速度更快、网络延迟更低的地域节点,地域指云服务器所在的地理位置区域,地域以城市划分,如北京、杭州、深圳及上海等,如何选择地域?建议根据用户所在地区就近选择地域&…

如何将大华dav视频转mp4?一键无损清晰转换~

Digital Audio Video(DAV)文件格式源于数字监控领域,旨在解决视频监控数据的存储和回放问题。随着数字监控技术的发展,DAV格式逐渐成为监控设备记录视频的标准格式,广泛应用于安防系统、摄像头监控等场景。 MP4文件格式…

掌握微服务性能监控:走向高效稳定的系统之路

掌握微服务性能监控:走向高效稳定的系统之路 一、微服务性能监控的挑战二、性能监控的目标与指标三、性能监控工具概览四、实践案例分析五、结语 大家好,这里是程序猿代码之路,在当今快速迭代和发布的软件开发周期中,微服务架构以…

付费代理IP与免费代理IP的区别

目录 一、稳定性与可用性 二、速度与性能 三、安全性与隐私保护 四、功能与服务 五、案例与代码示例 六、总结 在网络爬虫、数据分析、网络安全测试等场景中,代理IP的使用是非常普遍的。代理IP能够帮助用户隐藏真实IP地址,突破地域限制&#xff0c…