Python教程(21)——面向对象编程的三大特性

news2024/11/18 9:40:15

面向对象三大特性

    • 封装
    • 继承
    • 多态

在Python中,面向对象编程是一种核心的编程思想。Python被称为“一切皆对象”的语言,因为在Python中,几乎所有的数据都被视为对象。这包括数字、字符串、列表、函数等基本类型,还有自定义的类和对象。

Python中的面向对象编程提供了类(Class)来创建对象(Object)。类是一个抽象的概念它定义了对象的属性和方法。对象是类的实例,它具有类定义的属性和方法。

当谈到面向对象编程时,封装、继承和多态是三个重要的概念和机制。
在这里插入图片描述

封装

封装(Encapsulation)是面向对象编程三大特性之一,它指的是将数据和对数据的操作进行封装,形成一个独立的、可复用的单位,同时隐藏内部细节,只暴露必要的接口供外部使用。

封装的目的在于将信息隐藏起来,防止外部直接访问和修改内部数据,通过将数据和操作封装在一起,提高代码的安全性和可维护性。

封装在面向对象编程中意味着将数据和数据相关的操作封装在一个对象中。通过将数据进行封装,使得数据对外部来说是不可见的,只能通过特定接口(方法)来访问和修改数据。

下面是一个简单的封装示例:

class Car:
    def __init__(self, brand, model, color):
        self._brand = brand   # 使用单下划线表示受保护属性
        self.__model = model  # 使用双下划线表示私有属性
        self.color = color    # 公有属性

    def get_brand(self):
        return self._brand

    def set_model(self, model):
        self.__model = model

    get_model(self):
        return self.__model

car = Car("Tesla", "Model 3", "Red")
print(car.color)  # 输出:Red
print(car.get_brand())  # 输出:Tesla
print(car.get_model())  # 输出:Model 3

car.color = "Blue"
car.set_model("Model Y")

print(car.get_model())  # 输出:Model Y

在上述示例中,Car类封装了汽车的品牌、型号和颜色。brand属性和color属性都是公有属性,可以直接访问和修改。model属性使用双下划线前缀表示为私有属性,外部不能直接访问,需要通过公有方法来进行访问和修改。
在封装中,我们通过定义公有和私有方法来控制对私有属性的访问。通过公有方法get_brandset_model来访问和修改私有属性__model
通过封装,我们可以隐藏实现细节,对外部提供简单的接口,使得外部用户无需了解内部的具体实现细节,提高代码的安全性和可维护性。
所以可以说,封装在面向对象编程中是一种将数据和相关操作封装在一个独立的单元中的机制,通过定义访问控制和提供接口,实现对数据的保护和隔离,同时提供简单、安全和可维护的对外交互方式。

继承

继承(Inheritance)是面向对象编程三大特性之一,它允许创建一个新的类(称为派生类或子类),并基于已存在的类(称为基类或父类)进行扩展和重用已有的属性和方法。

继承的主要目的是实现代码的重用和结构的层级化组织,通过继承,子类可以继承父类的属性和方法,并且可以在此基础上添加新的属性和方法,或者修改已有的属性和方法。

继承有以下几个重要的特点和用途:

  • 继承关系:在继承中,派生类与其基类之间会形成一种关系,派生类继承了基类的属性和方法,并且可以访问和使用它们。派生类可以看作是基类的一种特殊化。
  • 代码重用:通过继承,派生类可以重用基类已有的代码,避免重复编写相同的功能。这种重用性可以提高代码的可维护性和可扩展性。
  • 扩展和修改:派生类可以在基类的基础上添加新的属性和方法,以实现更具体、更特定的功能。同时,派生类也可以重写基类中的方法,以修改或定制已有的行为。
class Animal:
    def __init__(self, name):
        self.name = name

    def make_sound(self):
        print("Animal makes sound.")

class Dog(Animal):
    def make_sound(self):
        print("Dog barks.")

class Cat(Animal):
    def make_sound(self):
        print("Cat meows.")

dog = Dog("Buddy")
dog.make_sound()  # 输出:Dog barks.

cat = Cat("Fluffy")
cat.make_sound()  # 输出:Cat meows.

在上述示例中,Animal类是一个基类,定义了一个make_sound方法。Dog类和Cat类分别是派生类,它们继承了Animal类,并且都重写了make_sound方法。

通过继承,DogCat类获得了Animal类中的属性和方法,即name属性和make_sound方法。派生类通过重写make_sound方法,修改了基类方法的实现细节,分别实现了狗叫和猫叫的行为。

需要注意的是,继承应该遵循"是一个"的原则,即派生类应该是基类的一种类型。如果两个类之间没有明显的"is-a"关系,可能不合使用继承。

多态

多态(Polymorphism)是面向对象编程三大特性之一,具体是指同一个方法可以在不同的对象上具有不同的表现形式。多态性允许我们使用统一的接口来操作不同的对象,提高了代码的灵活性和可扩展性。这样子说可能有点抽象,我们举个例子来说明下多态的含义。

当我们讨论多态性时,常常会使用动物世界的例子来解释。想象一下有一个基类 Animal,它有一个名为 sound() 的方法。然后有两个派生类 Dog 和 Cat,它们都继承自 Animal 类,并且都重写了 sound() 方法。

class Animal:
    def sound(self):
        pass

class Dog(Animal):
    def sound(self):
        print("Dog barks.")

class Cat(Animal):
    def sound(self):
        print("Cat meows.")

def make_sound(animal):
    animal.sound()

dog = Dog()
cat = Cat()

make_sound(dog)  # 输出: Dog barks.
make_sound(cat)  # 输出: Cat meows.

在上述例子中,我们定义了 Animal 类作为基类,它有一个名为 sound() 的方法。然后,我们创建了两个派生类 Dog 和 Cat,它们都继承了 Animal 类,并重写了 sound() 方法。在 Dog 类中,sound() 方法输出 “Dog barks.”;在 Cat 类中,sound() 方法输出 “Cat meows.”。

接下来,我们定义了一个名为 make_sound() 的函数,它收一个 Animal 对象作为参数,并调用该对象的 sound() 方法。在函数内,我们不需要考虑传入的对象具体是哪个类的实例,只需要知道它们都是 Animal 类的派生类对象。

我们通过分别传入 Dog 类和 Cat 类的实例调用了 make_sound() 函数。因为这些对象都是 Animal 的派生类对象,所以它们都有 sound() 方法。在运行时根据对象的实际类型,会自调用相应的 sound() 方法。因此,make_sound(dog) 的输出为 “Dog barks.”,make_sound(cat) 的输出为Cat meows."。

这个例子展现了多态的特点,使用统一的接口(基类)不同类型的对象实现了代码的灵活性和可扩性。我们可以通过添加更多的派类来扩展动的种类,而不需要修改现有的代码。

以上就是Python面向对象编程中的一些最核心、最基本的概念。封装是将数据封装在一个类中,通过限制直接访问数据从而保护数据的安全性与完整性。继承是一种机制,它允许派生类(子类)继承基类(父类)的属性和方法,使得派生类能够重用基类的代码,并可以根据需要进行扩展或修改。多态是指在运行时,具有相同接口但具体行为不同的对象,可以根据上下文的需要,以统一的方式进行使用和处理,从而提高代码的灵活性和可扩展性。这些文字都是比较抽象的,可以根据具体的代码例子来加深理解。

**更多精彩内容,请关注同名公众:一点sir(alittle-sir)

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

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

相关文章

安卓(雷电)模拟器清除屏幕密码

1、设置磁盘可写 启动模拟器,然后在模拟器的设置界面,设置磁盘共享为可写入,重启模拟器,如下图: 2、找到模拟器目录 返回桌面,右键模拟器图标,打开文件所在目录,如下图&#xff1a…

【Spring Cloud】Gateway组件的三种使用方式

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 &am…

【2024系统架构设计】 系统架构设计师第二版-面向服务架构设计理论与实践

目录 一 概述 二 SOA的参考架构 三 SOA主要协议和规范 四 SOA设计标准和原则 五 SOA的设计模式 六 SOA的构建和实施 ​

【前端】前后端的网络通信基础操作(原生ajax, axios, fetch)

概述 前后端网络请求工具 原生ajaxfetch apiaxios GET和POST请求 get只能发纯文本 post可以发不同类型的数据,要设置请求头,需要告诉服务器一些额外信息 测试服务器地址 有一些公共的测试 API 可供学习和测试用途。这些 API 允许你发送 HTTP 请求…

浏览器不支持 css 中 :not 表达式的解决方法

问题 使用 :not 表达式的样式在不同浏览器中存在不生效的问题。 原因 不生效是因为浏览器版本较低所导致的。(更多详细信息请看:MDN) 解决方法 初始写法: .input-group:not(.user-name, .user-passwork){width: auto; }改成…

基于jsp的在线求职招聘信息系统 设计与实现

当前企业求职招聘的方式更多是通过传统的线下招聘会或职业介绍所来实现的,其不但受众具有很大的局限性,而且往往不可能在短时间内招聘的需要的人才。而互联网的普及为企业求职招聘的方式带来了翻天覆地的改变。通过互联网将招聘信息进行发布可以在短时间…

(1)(1.13) SiK无线电高级配置(五)

文章目录 前言 10 可用频率范围 11 DUTY_CYCLE 设置 12 低延迟模式 13 先听后说 (LBT) 14 升级无线电固件 15 MAVLink协议说明 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 1…

Web缓存代理

目录 一.Web缓存代理 配置Nginx 缓存代理: 修改web服务器的配置文件: 修改192.168.233.10代理服务器的配置文件: 访问页面看看: 对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来…

STL-vector

目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.3 vector 增删查改 1.2.4 vector 迭代器失效问题。(重点) 1. 会引起其底层空间改变的操作&#x…

C++:多态究竟是什么?为何能成为面向对象的重要手段之一?

C:多态究竟是什么?为何能成为面向对象的重要手段之一? 前言一、多态的概念二、多态的定义及实现2.1 多态的构成条件2. 2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的例外1:协变(基类与派生类虚函数返回值类型不同)2.3.2 虚函数重写…

【信息论与编码】【北京航空航天大学】实验一、哈夫曼编码【C语言实现】(上)

信息论与编码 实验1 哈夫曼编码 实验报告 一、运行源代码所需要的依赖&#xff1a; 1、硬件支持 Windows 10&#xff0c;64位系统 2、编译器 DEV-Redpanda IDE&#xff0c;小熊猫C 二、算法实现及测试 1、C语言源程序 # define _CRT_SECURE_NO_WARNINGS # include <std…

江山易改本性难移之ZYNQ SDK FSBL加载启动代码详解

SDK版本&#xff1a;2018.3 写在前面&#xff1a; 该文档不足以使你清楚FSBL启动的寄存器级的操作细节&#xff0c;但可以让你看明白整个ZYNQ7000 FSBL代码执行的主要流程。 1. ZYNQ7000加载启动流程 &#xff08;1&#xff09;BootRom阶段为ARM上电后最早加载的代码&#x…

Android SDK环境搭建

一、Android SDK简介 SDK&#xff1a;&#xff08;software development kit&#xff09;软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 因此&#xff0c;Android SDK 指的是Android专属的软件…

【Scala】——函数式编程

1 面向对象编程和函数式编程 1.1 面向对象编程 解决问题&#xff0c;分解对象&#xff0c;行为&#xff0c;属性&#xff0c;然后通过对象的关系以及行为的调用来解决问题。 • 对象&#xff1a;用户 • 行为&#xff1a;登录、连接 JDBC、读取数据库 • 属性&#xff1a;用户…

内裤洗衣机有用吗?五款小型洗衣机全自动推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

Linux运维之切换到 root 用户

春花秋月何时了,往事知多少。此付费专栏不要订阅,不要订阅,听人劝。 🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项目实战] 介绍Java…

C/C++ 位段

目录 什么是位段&#xff1f; 位段的内存分配 位段的跨平台问题 什么是位段&#xff1f; 位段的声明与结构是类似的&#xff0c;但是有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或signed int 等整型家族。位段的成员名后边有一个冒号和一个数字 这是一个…

JPEG格式详解Baseline、Progressive的区别

文章目录 JPEG的简介压缩质量/压缩比率色彩空间基线和渐进子采样存储选项 基线和渐进基线格式渐进格式&#xff1a; 子采样4:4:4&#xff08;无损&#xff09;4:2:24:2:0 JPEG的简介 JPEG&#xff08;Joint Photographic Experts Group&#xff09;是一种常见的图像压缩格式&a…

K8S 存储卷

意义&#xff1a;存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete,k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件…