Python教程(十):面向对象编程(OOP)

news2024/12/24 20:03:43

目录

    • 专栏列表
    • 前言
    • 一、面向对象编程概述
      • 1.1 类和对象
      • 1.2 继承
      • 1.3 多态
      • 1.4 封装
    • 二、Python 中的类和对象
      • 2.1 定义类
      • 2.2 `__init__` 函数解释
      • 2.3 创建对象
    • 三、继承
      • 3.1 基本继承
      • 3.2 创建子类对象
    • 四、多态
    • 五、封装
    • 六. 访问限制
    • 七、综合实例
    • 结语

专栏列表

  • Python教程(一):环境搭建及PyCharm安装
  • Python 教程(二):语法与数据结构
  • Python 教程(三):字符串特性大全
  • Python 教程(四):Python运算符合集
  • Python 教程(五):理解条件语句和循环结构
  • Python 教程(六):函数式编程
  • Python 教程(七):match…case 模式匹配
  • Python 教程(八):高级特性【高逼格代码】
  • Python 教程(九):内置模块与第三方模块
  • Python教程(十):面向对象编程(OOP)

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


前言

在现代编程中,面向对象编程(OOP)是一种非常重要的编程范式。Python 作为一种高级编程语言,广泛支持面向对象编程。本篇文章将详细介绍 Python 中 OOP 的基本概念和应用,并通过实例帮助你更好地理解和掌握 OOP。

一、面向对象编程概述

面向对象编程是一种将现实世界中的概念映射到程序中的编程范式。在 OOP 中,基本概念包括类(Class)、对象(Object)、继承(Inheritance)、多态(Polymorphism)和封装(Encapsulation)。

1.1 类和对象

  • 类(Class):类是一个模板,用于定义对象的属性和行为。
  • 对象(Object):对象是类的实例,通过类创建。

1.2 继承

继承是一种机制,允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以重用代码,减少冗余。

1.3 多态

多态允许不同类的对象以相同的方式调用方法,即使这些方法在不同的类中有不同的实现。

1.4 封装

封装是一种将数据和方法绑定在一起,并隐藏对象的内部实现细节的机制。

二、Python 中的类和对象

2.1 定义类

  • 在 Python 中,可以使用 class 关键字定义一个类。
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"Hello, 我叫 {self.name} ,今年 {self.age} 岁")

2.2 __init__ 函数解释

  • 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法(java 中称为:构造函数),在创建实例的时候,就把nameage等属性绑上去:
  • 注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。
  • 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去

2.3 创建对象

使用类名调用,可以创建对象(实例)。

user = Person("子羽", 30)
user.greet()  # 输出: Hello, 我叫 子羽 ,今年 30 岁

三、继承

3.1 基本继承

在 OOP 程序设计中,当我们定义一个 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类(Subclass),而被继承的 class 称为基类、父类或超类(Base class、Super class)。
通过继承,可以创建一个新的类,这个新类继承了父类的属性和方法。

例如当我们的 A 类需要继承 B 类,我们可以学成 A(B)

示例代码

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"Hello, 我叫 {self.name} ,今年 {self.age} 岁")

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age) # 使用 super() 可以获取父类的方法
        self.student_id = student_id

    def display(self):
        print(f"学号: {self.student_id}")

在这里插入图片描述

3.2 创建子类对象

student1 = Student("张三", 20, "S12345")
student1.greet()  # 输出: Hello, 我叫 张三 ,今年 20 岁
student1.display()  # 输出: 学号: S12345

四、多态

多态允许子类定义与父类同名的方法,但是这些方法在不同的类中可以有不同的实现,例如下面的 Teacher 的问候就会跟 Student 的问候不一样

class Teacher(Person):
    def greet(self):
        print(f"Hello, 我是 {self.name} 教授")

teacher1 = Teacher("李春华", 40)
teacher1.greet()  # 输出: Hello, 我是 李春华 教授

五、封装

封装是将数据(属性)和行为(方法)结合在一起,并隐藏内部细节。

class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.__balance = balance

    def deposit(self, amount):
        self.__balance += amount

    def get_balance(self):
        return self.__balance

account = Account("约翰")
account.deposit(100)
print(account.get_balance())  # 100

六. 访问限制

命名约定

  • 公有属性和方法:使用小写字母。
  • 私有属性:使用双下划线前缀。
  • 受保护的属性:使用单下划线前缀。

示例代码

class Car:

    brand = '宝马' # 类属性:公有属性

    def __init__(self, color):
        self.color = color
        self.__mile = 200000  # 私有
    def get_mile(self):  # 公有方法
        return self.__mile

car = Car('黄色')
print(car.brand) # 宝马
print(car.color) # 黄色
# print(car.__mile) # 'Car' object has no attribute '__mile'
print(car.get_mile()) # 200000

在这里插入图片描述

七、综合实例

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

animals = [Dog("小白"), Cat("菊花")]

for animal in animals:
    print(animal.speak())

输出:

小白 says Woof!
菊花 says Meow!

结语

通过本篇文章,我们介绍了 Python 中面向对象编程的基本概念和应用。掌握这些知识能够帮助你更好地组织和管理代码,提高代码的重用性和可维护性。如果你有任何疑问或想法,欢迎在评论区留言讨论。


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

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

相关文章

MySQL~SQL语法

SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系数据库管理系统(RDBMS)的标准化语言。 SQL 在标识符(如表名、列名、函数名等)的处理上通常是不区分大小写的,这…

如何手写一个SpringBoot框架

你好,我是柳岸花开。 在这篇文章中,我们将手写模拟SpringBoot的核心流程,让大家能够以一种简单的方式了解SpringBoot的大概工作原理。 项目结构 我们创建一个工程,包含两个模块: springboot模块,表示Spring…

Redis 有关列表的命令

List 也叫列表,一般用来操作和存储一组有顺序的数据; 索引与数组类似,从 0 开始; 1. 从列表头部添加 LPUSH 2. 获取列表内容 LRANGE LRANGE 键名称 起始位置 结束位置 注意: LPUSH 命令将添加的元素依次添加到列…

IEEE1801 UPF 编写指南-1.MSV设计

多电源电压(MSV)设计为核心技术使用多个电源电压,如图1-1“MSV设计示例”所示。顶层设计和实例inst_A在电压VDD1下操作,而实例inst_B在电压VDD2下操作,实例inst_C在电压VDD3下操作。 在相同操作电压下运行(…

Chapter 23 数据可视化——地图

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、基础绘图二、视觉映射三、案例分析 前言 随着地理信息系统(GIS)技术的迅猛发展和大数据时代的到来,数据可视化已经成为分析和理…

供应链下生产计划有什么新要求?详解供应链下生产计划编制步骤!

在当今全球化和市场快速变化的商业环境中,供应链管理下的生产计划比以往任何时候都更为关键。企业不仅要应对需求的波动和供应的不确定性,还要在激烈的市场竞争中保持敏捷和效率。有效的生产计划已成为制造业乃至整个供应链成功的核心。本文将深入探讨供…

一款.NET开源、跨平台的DASH/HLS/MSS下载工具

前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、跨平台的DASH/HLS/MSS下载工具,并且支持点播和直播(DASH/HLS)的内容下载:N_m3u8DL-RE。 网络流媒体传输协议介绍 DASH DASH是一种基于HTTP的…

更改ubuntu的主屏幕

一、【问题描述】 如果有多个屏幕连接到ubuntu,Ubuntu的这个上面的通知栏如果不在我们希望的位置,会让人很不舒服,这个是根据主屏幕位置显示的,这个文章水一下如何改这个 二、【解决方法】 总之就是两个命令,先查再改…

3.Java面试题之AQS

1. 写在前面 AQS(AbstractQueuedSynchronizer)是Java并发包(java.util.concurrent)中的一个抽象类,用于实现同步器(如锁、信号量、栅栏等)。AQS提供了一种基于FIFO队列的机制来管理线程的竞争和…

condapytorch环境搭建笔记

1. 安装conda 官网安装地址:https://docs.anaconda.com/anaconda/install/linux/ 下载Installer curl -O https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh注:可以到这里查看和选择适合的版本:https://repo.anacon…

实验2-4-6 求交错序列前N项和

//实验2-4-6 求交错序列前N项和//本题要求编写程序&#xff0c;计算交错序列 1-2/33/5-4/75/9-6/11... 的前N项之和。 #include<stdio.h> #include<math.h> int main(){int n;scanf("%d",&n);//输入在一行中给出一个正整数N。double sum0;for(int i1…

SpringCloud Alibaba 微服务(三):OpenFeign

目录 前言 一、什么是OpenFeign&#xff1f; Feign 的实现 Feign 和 OpenFeign 的区别 二、OpenFeign的优点 三、基本用法 新建子工程 配置文件 服务注册 ​编辑 新建Controller 引入依赖 创建接口 启动类开启Feign注解 访问测试 四、FeignClient 标签的常用属性…

solidity抽象(abstract)合约(很常用)

当合约中至少有一个函数没有被实现&#xff0c; 或者合约没有为其所有的基本合约构造函数提供参数时&#xff0c; 合约必须被标记为 abstract。 即使不是这种情况&#xff0c;合约仍然可以被标记为 abstract&#xff0c; 例如&#xff0c;当您不打算直接创建合约时。 抽象&a…

Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo

Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo 1. 前提是咱们的Chatchat服务一起部署好了&#xff0c;可以参考 Langchain-Chatchat3.1版本docker部署流程——知识库问答 2. 搜索引擎 DuckDuckGo&#xff1a;该搜索引擎不需要key&#xff0c;但是需要全球上网服务&…

MongoDB change stream 详解

文章目录 什么是 Chang Streams实现原理故障恢复使用场景Spring Boot整合Chang Stream 什么是 Chang Streams Change Stream指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类…

MySQL基础练习题16-电影评分

题目 准备数据 分析数据 总结 题目 查找评论电影数量最多的用户名。如果出现平局&#xff0c;返回字典序较小的用户名。 查找在 February 2020 平均评分最高 的电影名称。如果出现平局&#xff0c;返回字典序较小的电影名称。 准备数据 ## 创建库 create database db; u…

微信小程序电商直播功能如何开通?

作者&#xff1a;阿龙 目前&#xff0c;公域直播电商平台&#xff08;抖音、快手、视频号等&#xff09;的获客流量成本越来越高&#xff0c;同时监管规则越来越严&#xff0c;扣点越来越高&#xff0c;并且没有用户分销机制&#xff0c;这些都在迫使商家尽快建立自己的私域直…

苹果Vision Pro在中国市场遇冷?连黄牛都炒不动了

随着科技巨头苹果公司推出的首款混合现实头戴设备Vision Pro正式登陆中国市场&#xff0c;这款备受瞩目的产品引发了广泛关注。 然而&#xff0c;短短一周之后&#xff0c;许多早期尝鲜的用户却开始陆续退场。究竟是什么原因导致大量用户选择退场呢&#xff1f;本文将从多个维…

绝密!OceanBase OBCP备考模拟题讲解(3)

「源de爸讲数据库」每天更新OceanBase OBCP题库及全网独家超详细题目解析&#xff0c;祝您早日持证上岸&#xff01; 现如今&#xff0c;一大批国产数据库随着国产化浪潮&#xff0c;已经逐步被越来越多的人认可。OceanBase便是其中一个优秀代表。 做这个日更专题&#xff0c…

ESP32-C2 烧录

自动下载电路 dtr rts &#xff1b;WCH 提供了相应的芯片&#xff0c;实现自动下载 CH340X &#xff08;*不要使用天问的下载器&#xff0c;电压为5V&#xff0c;下载前会重启电源&#xff0c;导致无法识别ESP芯片&#xff0c;修改&#xff0c;将电源线重引出 使用IDF编辑完成…