【Python篇】Python 类和对象:详细讲解(上篇)

文章目录

  • Python 类和对象:详细讲解
    • 1. 什么是类(Class)
      • 类的定义
    • 2. 什么是对象(Object)
      • 创建对象
    • 3. 属性和方法
      • 属性(Attributes)
      • 方法(Methods)
      • 在类中定义属性和方法
      • 使用对象的属性和方法
    • 4. self 参数的作用
    • 5. 总结1
      • 两个问题
        • 1. Python 类中的缩进
        • 2. 为什么 Python 没有像 C++ 那样单独定义成员变量
          • 2.1 动态语言的特性
          • 2.2 `__init__` 方法的灵活性
          • 2.3 灵活性和可扩展性
          • 结论
    • 6. 实例化多个对象
      • 实例化多个对象
      • 代码解读:
    • 7. 添加更多方法
      • 为类添加新的方法
      • 代码解读:
    • 8. 类的继承
      • 什么是继承?
      • 代码解读:
    • 9.总结2
  • 写在最后

Python 类和对象:详细讲解

在编程中,对象是面向对象编程(OOP)的核心概念。Python 是一门支持面向对象编程的语言,这意味着你可以使用类和对象来组织代码,使其更加模块化、可维护和可扩展。

1. 什么是类(Class)

  • 是一个蓝图或模板,用来描述某一类对象的共同特征和行为。它定义了对象应该具有什么属性(变量)和行为(方法)。
  • 举个例子,如果你要创建一个汽车管理系统,你可能会定义一个 Car 类,其中包括汽车的品牌、颜色、速度等属性,以及启动、停止、加速等行为。

类的定义

在 Python 中,类使用 class 关键字来定义。让我们来看一个简单的例子:

class Car:# 类的属性和方法定义在这里pass
  • class Car: 是类的定义,其中 Car 是类的名称。
  • pass 是一个占位符,表示目前类中没有任何内容,但这是一个合法的类定义。

2. 什么是对象(Object)

  • 对象是根据类创建的具体实例。你可以把类看作是一个模具,而对象则是根据这个模具制作出来的具体产品。
  • 如果 Car 是一个类,那么你可以创建多个对象来代表不同的汽车,如 my_caryour_car 等。

创建对象

要创建一个对象,只需要调用类本身,就像调用一个函数一样:

my_car = Car()
  • my_carCar 类的一个实例或对象。
  • 现在,my_car 这个对象可以拥有 Car 类中定义的所有属性和行为。

3. 属性和方法

属性(Attributes)

  • 属性是对象的状态或特征。它们是存储在对象中的变量。
  • 例如,汽车的品牌、颜色、速度都可以作为属性来存储在 Car 对象中。

方法(Methods)

  • 方法是对象可以执行的操作或行为。它们是定义在类中的函数。
  • 例如,汽车可以启动、停止、加速,这些行为可以通过方法来实现。

在类中定义属性和方法

让我们扩展 Car 类,添加一些属性和方法:

class Car:# 定义属性def __init__(self, brand, color):self.brand = brand  # 汽车品牌self.color = color  # 汽车颜色# 定义方法def start(self):print(f"The {self.color} {self.brand} car is starting.")def stop(self):print(f"The {self.color} {self.brand} car is stopping.")
  • __init__ 方法:这是一个特殊的方法,当你创建对象时,Python 会自动调用它。这个方法用于初始化对象的属性。self 是对象自身的引用,后面会详细解释。
  • startstop 方法:这些是普通的方法,用于描述汽车的行为。

使用对象的属性和方法

现在我们可以创建一个 Car 对象,并使用它的属性和方法:

my_car = Car("Toyota", "Red")
print(my_car.brand)  # 输出: Toyota
print(my_car.color)  # 输出: Redmy_car.start()  # 输出: The Red Toyota car is starting.
my_car.stop()   # 输出: The Red Toyota car is stopping.
  • 当我们创建 my_car 对象时,__init__ 方法被自动调用,brand 被设置为 “Toyota”,color 被设置为 “Red”。
  • 我们可以通过 my_car.brandmy_car.color 访问对象的属性,也可以调用 start()stop() 方法来执行相应的行为。

4. self 参数的作用

  • 在方法定义中,self 参数用于指代当前对象的实例。在方法内部,通过 self 可以访问对象的属性和其他方法。
  • 当调用方法时,Python 会自动将调用该方法的对象传递给 self。因此,在定义方法时,self 必须作为第一个参数。

举个例子:

class Car:def __init__(self, brand, color):self.brand = brandself.color = colordef start(self):print(f"The {self.color} {self.brand} car is starting.")
  • 当你调用 my_car.start() 时,实际上等同于 Car.start(my_car),即 Python 会自动将 my_car 对象传递给 self

5. 总结1

  • :一个蓝图,定义了一类对象的属性和行为。
  • 对象:根据类创建的具体实例,具有类定义的属性和方法。
  • 属性:对象的特征或状态,存储在对象中的变量。
  • 方法:对象的行为或操作,定义在类中的函数。
  • self 参数:引用当前对象,用于访问对象的属性和方法。

两个问题

1. Python 类中的缩进

在 Python 中,缩进是代码块的唯一表示方式,这与 C++ 和许多其他语言不同。在 Python 中,没有使用 {} 来定义代码块,而是通过缩进来明确代码块的层级关系。

  • 类的缩进

    • 在类定义的最外层,所有方法和属性的定义都需要有相同的缩进级别。
    • 类中的每个方法或函数,其内容需要进一步缩进,以表示它们属于该方法。

    例如:

    class Car:def __init__(self, brand, color):self.brand = brand  # 这行代码相对于方法的定义缩进了一个层级self.color = colordef start(self):print(f"The {self.color} {self.brand} car is starting.")
    

    在这个示例中:

    • def __init__(self, brand, color): 是类的一个方法,它相对于 class Car: 缩进了四个空格(或一个 tab)。
    • self.brand = brandself.color = color__init__ 方法中的代码,它们相对于 def __init__ 缩进了四个空格。
2. 为什么 Python 没有像 C++ 那样单独定义成员变量

在 Python 中,没有像 C++ 那样在类的开头单独定义成员变量(属性)的部分。这是因为 Python 采用了一种更灵活的方式来处理对象的属性。这种设计有几个重要原因:

2.1 动态语言的特性
  • 动态类型
    • Python 是一种动态类型的语言,这意味着变量的类型在运行时决定,并且你可以在程序的任何地方为对象添加新的属性。
    • 这与 C++ 等静态类型语言不同。在 C++ 中,你必须在编译时定义对象的所有成员变量(属性)的类型和数量。
2.2 __init__ 方法的灵活性
  • 属性在 __init__ 方法中定义

    • 在 Python 中,通常通过 __init__ 方法来初始化对象的属性。__init__ 方法是一个构造函数,当你创建一个对象时,这个方法会被自动调用。
    • __init__ 方法中使用 self 关键字定义的属性,实际上就是成员变量。这种方式可以根据初始化时传入的参数动态地定义和设置对象的属性。

    例如:

    class Car:def __init__(self, brand, color):self.brand = brand  # 这里 brand 就是一个成员变量self.color = color  # color 也是一个成员变量
    
    • 在这个例子中,brandcolorCar 对象的成员变量,通过 self.brandself.color__init__ 方法中定义。
2.3 灵活性和可扩展性
  • 动态添加属性

    • Python 的对象可以在程序的运行时动态地添加或修改属性。这为程序设计提供了极大的灵活性。

    例如:

    my_car = Car("Toyota", "Red")
    my_car.year = 2020  # 动态添加一个新的属性 year
    

    在运行时,你可以为 my_car 对象添加一个新的属性 year,这是在 C++ 等静态类型语言中难以实现的。

  • 更少的冗余

    • 由于 Python 的灵活性,你不需要在类的定义中事先声明所有可能的属性,而是可以根据实际需要在 __init__ 方法或其他方法中定义它们。
结论
  • 缩进:Python 使用缩进来明确代码块的层级关系,因此类中的方法和属性都需要适当缩进,以表示它们的层次。
  • 属性定义
    • Python 不需要像 C++ 那样在类的开头单独定义成员变量,而是通常在 __init__ 方法中通过 self 来定义对象的属性。
    • 这种方式更灵活,可以根据传入参数动态定义属性,并且可以在运行时动态添加或修改对象的属性。

6. 实例化多个对象

在前面的例子中,我们已经学会了如何创建一个对象,并使用它的属性和方法。现在我们将学习如何创建多个对象,并理解对象之间的独立性。

实例化多个对象

当你实例化多个对象时,每个对象都是类的一个独立实例,拥有自己独立的属性值。这意味着你可以创建多个对象,它们可以拥有不同的状态(属性值),但都可以共享相同的行为(方法)。

class Car:def __init__(self, brand, color):self.brand = brand  # 每个对象都有独立的 brand 属性self.color = color  # 每个对象都有独立的 color 属性def start(self):print(f"The {self.color} {self.brand} car is starting.")def stop(self):print(f"The {self.color} {self.brand} car is stopping.")# 创建多个对象
car1 = Car("Toyota", "Red")
car2 = Car("Honda", "Blue")
car3 = Car("Ford", "Black")# 使用这些对象
car1.start()  # 输出: The Red Toyota car is starting.
car2.start()  # 输出: The Blue Honda car is starting.
car3.start()  # 输出: The Black Ford car is starting.

代码解读:

  • 独立的对象car1, car2, car3Car 类的三个独立实例。每个对象都有自己的 brandcolor 属性。
  • 方法的共享:虽然每个对象的属性值不同,但它们都可以调用 start()stop() 方法,这些方法在所有对象之间是共享的。

通过实例化多个对象,你可以清晰地理解对象之间的独立性和类的灵活性。


7. 添加更多方法

我们已经学习了如何定义基本的方法,现在我们将进一步扩展我们的类,添加更多的方法以模拟更加复杂的行为。

为类添加新的方法

你可以为类添加任意数量的方法,这些方法可以操作对象的属性或执行特定的任务。让我们继续扩展 Car 类,添加一个 accelerate 方法,用来模拟汽车的加速。

class Car:def __init__(self, brand, color):self.brand = brandself.color = colorself.speed = 0  # 初始速度为0def start(self):self.speed = 10  # 启动后设置初始速度print(f"The {self.color} {self.brand} car is starting at {self.speed} km/h.")def accelerate(self, increase):self.speed += increaseprint(f"The {self.color} {self.brand} car is accelerating to {self.speed} km/h.")def stop(self):self.speed = 0  # 停车时速度为0print(f"The {self.color} {self.brand} car is stopping.")# 使用新的方法
car1 = Car("Toyota", "Red")
car1.start()         # 输出: The Red Toyota car is starting at 10 km/h.
car1.accelerate(30)  # 输出: The Red Toyota car is accelerating to 40 km/h.
car1.stop()          # 输出: The Red Toyota car is stopping.

代码解读:

  • speed 属性:我们添加了一个 speed 属性来跟踪汽车的速度。
  • accelerate 方法:这个方法用于增加汽车的速度。它接收一个 increase 参数,用来指定要增加的速度值。

8. 类的继承

继承是面向对象编程的一个重要特性,它允许你通过创建一个新的类,复用已有类的属性和方法。继承使得代码更加模块化、可重用和易于维护。

什么是继承?

  • 继承:当一个类(子类)继承另一个类(父类)时,子类自动拥有父类的所有属性和方法。你可以在子类中添加新的属性和方法,或者重写父类的方法。

让我们定义一个 ElectricCar 类,它继承自 Car 类,并添加一些特有的功能。

class Car:def __init__(self, brand, color):self.brand = brandself.color = colorself.speed = 0def start(self):self.speed = 10print(f"The {self.color} {self.brand} car is starting at {self.speed} km/h.")def accelerate(self, increase):self.speed += increaseprint(f"The {self.color} {self.brand} car is accelerating to {self.speed} km/h.")def stop(self):self.speed = 0print(f"The {self.color} {self.brand} car is stopping.")# 定义一个 ElectricCar 类,继承自 Car 类
class ElectricCar(Car):def __init__(self, brand, color, battery_capacity):super().__init__(brand, color)  # 调用父类的构造函数self.battery_capacity = battery_capacity  # 电池容量def charge(self):print(f"The {self.color} {self.brand} electric car is charging with {self.battery_capacity} kWh capacity.")# 使用 ElectricCar 类
electric_car = ElectricCar("Tesla", "White", 85)
electric_car.start()  # 调用继承的 start 方法
electric_car.accelerate(50)  # 调用继承的 accelerate 方法
electric_car.charge()  # 调用 ElectricCar 类中特有的方法
electric_car.stop()  # 调用继承的 stop 方法

代码解读:

  • super() 函数:在 ElectricCar 类中,我们使用 super() 函数调用了父类的 __init__ 方法,以便在子类中初始化父类的属性。
  • 子类扩展ElectricCar 类扩展了 Car 类,添加了一个新的属性 battery_capacity,以及一个新的方法 charge

9.总结2

通过这几个步骤,相信你已经了解了如何实例化多个对象、添加更多的方法,以及如何使用继承来创建新的类。每个步骤都为你进一步掌握 Python 的面向对象编程打下了基础。


写在最后

.更多有关Python类和对象的详细知识,请见下篇!


以上就是关于【Python篇】Python 类和对象:详细讲解(上篇)的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️

在这里插入图片描述

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

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

相关文章

重生奇迹MU 小清新职业智弓MM

游戏中有一种令人迷醉的职业——智弓MM,她们以高超的射箭技能闻名于世。本文将为您介绍这个悠闲的小清新职业,在游戏中的特点以及如何成为一名出色的智弓MM。跟随我们一起探索这个奇妙而神秘的职业吧! 悠闲的游戏节奏是游戏的初衷之一&#…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…

【设计模式】创建型模式——抽象工厂模式

抽象工厂模式 1. 模式定义2. 模式结构3. 实现3.1 实现抽象产品接口3.2 定义具体产品3.3 定义抽象工厂接口3.4 定义具体工厂3.5 客户端代码 4. 模式分析4.1 抽象工厂模式退化为工厂方法模式4.2 工厂方法模式退化为简单工厂模式 5. 模式特点5.1 优点5.2 缺点 6. 适用场景6.1 需要…

用3点结构的s1顺序标定2点结构的s2顺序

在行列可自由变换的条件下,3点结构有6个 (A,B)---6*30*2---(0,1)(1,0) 让A分别是3a1,2,…,6,让B全是0。当收敛误差为7e-4,收敛199次取迭代次数平均值,得到 迭代 搜索难度 1 13913.2 1 2 …

客服系统简易版

整体架构解读 客服端和商城端都通过websocket连接到客服系统, 并定期维持心跳当客户接入客服系统时, 先根据策略选择在线客服, 然后再发送消息给客服 websocket实现 用netty实现websocket协议, 增加心跳处理的handler, 详见chat-server模块 客服路由规则 暂时仅支持轮询的…

视频结构化从入门到精通——视频结构化主要技术介绍

视频结构化主要技术 1 视频接入 “视频接入”是视频结构化管道的起点(SRC Point)视频接入是视频结构化处理的第一步,它涉及将视频数据从各种采集源获取到系统中进行进一步处理。视频接入的质量和稳定性对后续的数据处理、分析和应用至关重要…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…

毕设创新点之一:基于GD32/STM32的AI模型部署-github库

将AI模型成功部署到边缘MCU中,常常受限于MCU的计算峰值和内存峰值的限制,部署较为困难,目前有一个将AI算法MCU部署到GD32系列MCU中的宝藏的开源库。 项目网址:HomiKetalys/gd32ai-modelzoo: Provide deployable deep learning mo…

Vue.js 模板语法详解:插值表达式与指令使用指南

Vue.js 模板语法详解:插值表达式与指令使用指南 引言 简要介绍主题: Vue.js 是一个现代化的 JavaScript 框架,用于构建用户界面。Vue 的模板语法提供了直观且功能强大的工具,用于将数据与 DOM 绑定。本文将深入探讨 Vue.js 的两个…

Training language models to follow instructionswith human feedback

Abstract 将语言模型做得更大并不会自动提高它们遵循用户意图的能力。例如,大型语言模型可能会生成不真实、有毒或对用户不有帮助的输出。换句话说,这些模型并未与用户对齐(aligned)。本文展示了一种通过人类反馈来对齐语言模型与…

2024实战指南:四款全免费的数据恢复工具盘点!

在这个数字化的时代里,数据的安全至关重要。如果一不小心删除或丢失了重要数据应该怎么办呢?这几个全免费的数据恢复工具可以帮你解决问题,亲测好用哦! 第一款:福昕数据恢复 直达链接:www.pdf365.cn/foxi…

【并发编程】从AQS机制到同步工具类

AQS机制 Java 中常用的锁主要有两类,一种是 Synchronized 修饰的锁,被称为 Java 内置锁或监视器锁。另一种就是在 JUC 包中的各类同步器,包括 ReentrantLock(可重入锁)、Semaphore(信号量)、Co…

Android13 Launcher3 客制化Workspace页面指示器

需求:原生态的workspace页面指示器是个长条,不大好看,需要进行客制化 实现效果如图: 实现原理: 代码实现在WorkspacePageIndicator.java 布局在launcher.xml里 实现在WorkspacePageIndicator.java通过重写onDraw函数…

顺序循环队列

顺序循环队列 队头插入元素,队尾删除元素 本来应该判空和判断是否存满的条件都是:队头 队尾,但这样就没办法区分了,所以,就牺牲一个空间(比如长度为10,但只能存9个),这…

auto的使用场景

auto的两面性 合理使用auto 不仅可以减少代码量, 也会大大提高代码的可读性. 但是事情总有它的两面性 如果滥用auto, 则会让代码失去可读性 推荐写法 这里推荐两种情况下使用auto 一眼就能看出声明变量的初始化类型的时候 比如迭代器的循环, 用例如下 #include <iostre…

利用autoDecoder工具在数据包加密+签名验证站点流畅测试

站点是个靶场 https://github.com/0ctDay/encrypt-decrypt-vuls 演示地址http://39.98.108.20:8085/ 不是仅登录位置暴力破解的那种场景&#xff0c;使用autoDecoder&#xff08;https://github.com/f0ng/autoDecoder&#xff09;的好处就是每个请求自动加解密&#xff0c;测…

关于ThinkPHP 5 框架开启自动搜索控制器 无法访问的问题坑

假如当前有一个登陆接口功能 因为后续会有不同版本的 登陆接口 这时候 我们可以在控制器中 新建文件夹 做区分 方便管理即 新建了一个 api 模块 文件路径是 api/controller/V1/Login 正常情况下 controller 目录下 是 控制器文件 login.php 文件&#xff0c;由于我们有多个…

Qt text-align和padding属性

1. text-align属性是用来设置文本的水平对齐方式。 text-align: center 文本将居中显示text-align: left 文本将左对齐显示text-align: right 文本将右对齐显示 2. 内边距padding: 内边距是元素内容与其边框之间的空间 padding-left: 10px; 距离内左边距10个像素点padding-r…

时序预测 | 基于WTC+transformer时间序列组合预测模型(pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 WTCtransformer时间序列组合预测模型 WTC,transformer 创新点&#xff0c;超级新。先发先得&#xff0c;高精度代码。 预测主模型transformer也可以改其他WTC-former系列&#xff0c;比如WTC-informer/autoformer等等…

LLaMA Factory微调Llama3模型

LLaMA Factory是一款开源低代码大模型微调框架&#xff0c;集成了业界最广泛使用的微调技术&#xff0c;支持通过Web UI界面零代码微调大模型&#xff0c;目前已经成为开源社区内最受欢迎的微调框架。 &#x1f4a5;GPU推荐使用24GB显存的A10&#xff08;ecs.gn7i-c8g1.2xlarg…