Python 面向对象——1.基本概念

本章学习链接如下:

基本概念与语法

类(Class):定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。

对象(Object):类的实例。对象包含实际的数据和操作数据的方法。

属性(Attribute):对象的变量,用于存储数据。

方法(Method):属于对象的函数,用于定义对象的行为。

继承(Inheritance):允许一个类继承另一个类的属性和方法,从而促进代码的重用。

封装(Encapsulation):隐藏对象的内部细节,只通过定义好的接口与外界交互,这有助于降低系统的复杂性和增强安全性。

多态(Polymorphism):指允许使用对象的共同接口来访问不同的底层形式(数据类型)

 1.类和对象

这样干巴巴的解释非常的难以理解,我们可以把类想象成一个制造蛋糕的食谱。食谱上有制作蛋糕所需的原材料(属性)和制作步骤(方法)。这个食谱就是一个模板,告诉你如果按照特定的步骤操作,将得到什么样的蛋糕。运用不同的方法我们可以得到不同口味的蛋糕。

对象则是根据这个食谱实际制作出来的蛋糕。每次你使用这个食谱制作蛋糕,都会得到一个新的蛋糕实体,这就是一个对象。虽然每个蛋糕的基本结构相同(因为都是按照同一食谱来的),但你可以根据口味调整原料,比如加更多的糖或者少放点盐,这样每个蛋糕都有自己独特的风味,这些特定的风味和特征就是对象的属性。

比如现在我们需要写一个代码题目,有一个类叫做 Car,它定义了车辆的基本属性如品牌、颜色、速度,以及可以进行的操作如启动、停止等。当你创建一个具体的 Car 对象时,比如一个红色的丰田汽车,你就是根据 Car 类的食谱制作了一个蛋糕,这个蛋糕具体的是红色的,品牌是丰田。

我们一步步来做这个题目:


在指明类的属性中,我们用到的是类的构造函数,类的构造函数是一个非常重要的组件,它的主要作用是初始化新创建的对象的状态,构造函数被称为__init__方法。

(1)基本语法

构造函数

构造函数是通过定义一个名为 __init__ 的特殊方法实现的。这个方法会在类的对象被创建时自动调用。

  • class ClassName::定义了一个名为 ClassName 的类。
  • def __init__(self, param1, param2):是类的构造函数。__init__ 是一个由Python预定义的特殊方法(也称为魔术方法),用于初始化新创建的对象。
  • self:是一个指向实例本身的引用,用于访问类的属性和方法。
  • param1, param2:构造函数可以接受参数,这些参数在创建类的实例时提供,用于设置对象的初始状态或执行其他操作。
  • self.param1 = param1:这句话代码的作用是:将传入的参数赋值给实例的属性,这句话可能有些拗口,这是什么意思呢?
  • self.param1和param1的区别:我们可以看到这两个变量的位置,param1是构造函数__init__的变量,而self.param1是类中的变量,所以如果我们想要访问基于类所创建的对象的属性和方法时,必须经过变量self.×××。
class ClassName:def __init__(self, param1, param2):self.param1 = param1self.param2 = param2

如下代码所示:

  • 当创建一个 Person 类的实例时,如 person1 = Person('Alice', 30),构造函数 __init__ 被调用,其中的 nameage 参数分别被设置为 'Alice'30
  • self.name = nameself.age = age 这两句代码将这些参数值赋给实例的 nameage 属性。即作用为当我们创建类中不同的实例时,这些实例就已经拥有了类中的属性,不同的实例对于这些属性有不同的赋值,这意味着 在这个例子中,person1.name 将被设置为 'Alice'person1.age 被设置为 30
  • 这样设置后,这些属性可以在类的其他方法中被访问和使用,比如 display 方法可以打印出这些属性的值。
class Person:def __init__(self, name, age):self.name = nameself.age = agedef display(self):print(f"Name: {self.name}, Age: {self.age}")

2.属性和方法

关于属性之前我们介绍过了 。

类的属性

属性是类中定义的变量,用于存储对象的状态或数据。在类的实例中,每个属性可以有不同的值,即每个对象可以有自己的属性值。

类的方法

方法是定义在类中的函数,用于执行操作,可以访问和修改类的属性,或执行与类功能相关的任务。

基本语法
class ClassName:def method_name(self, parameter1, parameter2):# 方法体return some_value
具体实例

在这个示例中,Car 类有一个方法 describe,它返回一条描述该汽车的信息。这个方法使用了 self 关键字来访问实例的属性。 

class Car:def __init__(self, brand, color):self.brand = brandself.color = colordef describe(self):return f"This is a {self.color} {self.brand}."

实例,属性,方法的具体使用

这个代码示例展示了如何创建一个具有属性和方法的 Car 类。accelerate 方法用于增加汽车的速度,而 brake 方法用于停车。每个方法都通过 self 访问和修改了汽车的状态,展示了面向对象编程的封装特性 

class Car:def __init__(self, brand, color, speed=0):self.brand = brandself.color = colorself.speed = speeddef describe(self):return f"This is a {self.color} {self.brand}."def accelerate(self, amount):self.speed += amountreturn f"{self.brand} is now going {self.speed} km/h."def brake(self):self.speed = 0return f"{self.brand} has stopped."# 创建Car类的实例
my_car = Car("Toyota", "red")
print(my_car.describe())  # 调用方法
print(my_car.accelerate(50))  # 加速车辆
print(my_car.brake())  # 刹车停车

 


练习题

创建一个 Car 类的实例,名为 my_car,它是一个红色的丰田汽车。随后调用这个实例的启动、加速、减速和停止方法,以展示类的功能。通过这些操作,可以看到汽车状态的变化和如何通过类的方法控制这些状态。这是一个很好的面向对象编程(OOP)示例,展示了如何用Python来封装数据和功能。

1.指明类属性,指明car这个类的属性是品牌,颜色,初始速度为0.

class Car:def __init__(self, brand, color, speed=0):self.brand = brandself.color = colorself.speed = speed
  1. 构造函数:接受品牌、颜色和可选的初始速度参数,初始化汽车的基本属性。
  2. 启动方法 (start):将汽车的速度从0增加到10,并打印当前状态。
  3. 停止方法 (stop):将汽车的速度设置为0,并打印停车状态。
  4. 加速方法 (accelerate):接受一个增量参数,将此数值加到当前速度上,并打印新的速度。
  5. 减速方法 (decelerate):接受一个减速值,如果减速值大于当前速度,则调用停止方法;否则从当前速度中减去该值,并打印新的速度。

代码如下所示,并带有对应的注释。

class Car:def __init__(self, brand, color, speed=0):"""初始化一个新汽车,指定品牌、颜色和可选的初始速度。:param brand: String, 汽车的品牌。:param color: String, 汽车的颜色。:param speed: Integer, 汽车当前的速度,默认为0。"""self.brand = brandself.color = colorself.speed = speeddef start(self):"""启动汽车,将速度从0设置为默认的起始速度10。"""self.speed = 10print(f"已启动{self.color}色的{self.brand}汽车,当前速度为{self.speed}。")def stop(self):"""停止汽车,将速度设置为0。"""self.speed = 0print(f"{self.color}色的{self.brand}汽车已停止。")def accelerate(self, increase):"""增加汽车的速度。:param increase: Integer, 增加的速度量。"""self.speed += increaseprint(f"{self.color}色的{self.brand}汽车正在加速,当前速度为{self.speed}。")def decelerate(self, decrease):"""减少汽车的速度。:param decrease: Integer, 减少的速度量。"""if decrease > self.speed:print("减速量超过当前速度,汽车将停止。")self.stop()else:self.speed -= decreaseprint(f"{self.color}色的{self.brand}汽车正在减速,当前速度为{self.speed}。")# 创建一个具体的 Car 对象
my_car = Car('Toyota', 'red')# 使用 Car 对象的方法
my_car.start()
my_car.accelerate(20)
my_car.decelerate(10)
my_car.stop()

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

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

相关文章

NLP_知识图谱_三元组实战

文章目录 三元组含义如何构建知识图谱模型的整体结构基于transformers框架的三元组抽取baselinehow to use预训练模型下载地址训练数据下载地址 结构图代码及数据bertconfig.jsonvocab.txt datadev.jsonschemas.jsontrain.jsonvocab.json 与bert跟data同个目录model.pytrain.py…

原型和原型链--图解

https://juejin.cn/post/7255605810453217335 prototype是函数的属性(一个对象),不是对象的属性,普通函数和构造函数的prototype属性是空对象{}(其实有2个属性,一个是constructor&a…

Vue3: toRefs与toRef的基本使用

一、前言 本文主要介绍toRefs与toRef的基本使用。 二、内容 1、基本概念 作用: toRefs与toRef可以将一个响应式对象中的每一 个属性,转换为ref对象;不同 toRefs与toRef功能一致,但toRefs可以批量转换。 2、toRefs 如果把reactive定义的…

记录交叉编译环境配置--海思开发板的 嵌入式nginx和 php的移植

嵌入式 lnmp搭建的记录 一些交叉编译的配置环境思路分享:P:php编译PHP可能遇到的问题configure阶段:Makefile-make阶段:Makefile-make install阶段: N:Nginx 文章比较水,并没有没解决什么实际问…

二维码门楼牌管理应用平台建设:助力场所整改与消防安全

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、二维码门楼牌管理应用平台在场所整改中的作用三、二维码门楼牌管理应用平台的意义与价值四、二维码门楼牌管理应用平台的未来展望 前言 随着城市管理的日益精细化,二维码门楼牌管理应用平台的建设成为了提…

C++ - STL详解(七)— stack和queue的介绍及使用

目录 一. stack 1.1 stack的介绍 1.2 stack的定义 1.3 stack的使用 ​编辑 二. queue 2.1 queue的介绍 2.2 queue的定义 2.3 queue的使用 一. stack 1.1 stack的介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除…

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时,日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态,定位问题,以及优化性能。下面&a…

【Java】如何获取客户端IP地址

在项目中往往涉及到“获取客户端IP地址”,常见到下面这样子的代码: package com.utils;import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.reactive.ServerHttpRequest; import java.net…

逻辑运算符

一 介绍 用于连接多个条件( 多个关系表达式) , 最终的结果也是一个 boolean 值。 &:逻辑与&&:短路与|:逻辑或||:短路或! 取反^:异或 二 逻辑运算规则 a&a…

K210基础实验——独立按键中断

前言 学习K210开发板的独立按键和中断功能 一、涉及到的外设资源是K210开发板上的BOOT按键和RGB灯 二、BOOT按键按下,MCU上连接BOOT的IO口变为低电平,松开后为高电平 三、引脚对应关系 BOOT : IO16 RGB灯: R:IO6 G:IO7 B:IO8 四、在…

【linux】多路径|Multipath I/O 技术

目录 简略 详细 什么是多路径? Multipath安装与使用 安装 使用 Linux下multipath软件介绍 附录 配置文件说明 其他解 简略 略 详细 什么是多路径? 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。 而到了分布式环境,主机和存储网络连…

UDP协议深度解析:从原理到应用全面剖析

⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 随着互联网的蓬勃发展,网络通信协议成为了支撑其稳定运行的关键。UDP协议作为网络通信协议中的重要一员&…

华为ensp中rip和ospf路由重分发 原理及配置命令

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月20日20点21分 路由重分发(Route Redistribution)是指路由器将从一种路由协议学习到的路由信息,通过另一种路由协议通告出去的功…

现货白银保证金交易要先分析趋势

现货白银是保证金交易品种,买卖过程中可能会涉及数十倍的资金杠杆,所以它对投资者的分析水平和交易水平的要求都比较高,所以在进入这个市场之前,投资者需要先学习一些基本的分析方法,当中可以分为基本面和技术面两大流…

C++智能指针(二十)

一.RAII(Resource Acquisition Is Initialization) RAII资源获取即初始化,RAII的思想就是在构造时初始化资源,或者托管已经构造的资源。在析构的时候释放资源。一般不允许复制或赋值,并且提供若干的资源访问的方法。比…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求,返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析,…

RS232、RS485、RS422、TTL、CAN各自的区别

目录 一:工业串口通信标准RS232、RS485、RS422的区别 第一个区别、硬件管脚接口定义不同 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别,逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 二:RS232、RS…

docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建

go-cqhttp,基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生实现,只需简单的配置, 就可以基于 go-cqhttp 使用框架开发,具有轻量, 原生, 高并发, 低占用, 跨平台等特点。 1 go-cqhttp 官网及可执行文件下载链接 go-cqhttp 官网:ht…

【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

一、同步和互斥的概念 1.1、同步 访问资源在安全的前提下,具有一定的顺序性,就叫做同步。在多道程序系统中,由于资源有限,进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突,保证进程或线程之间能够按照既定…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…