Python 基础:类

目录

  • 一、类的概念
  • 二、定义类
  • 三、创建对象并进行访问
  • 四、修改属性的值
    • 方法一:句点表示法直接访问并修改
    • 方法二:通过方法进行修改
  • 五、继承
    • 继承父类属性和方法
    • 重写父类方法
  • 六、将实例用作属性
  • 七、导入类
    • 导入单个类
    • 从一个模块中导入多个类
    • 导入整个模块
    • 导入模块中的所有类
  • 八、一些代码编写规范

遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步!
在这里插入图片描述
本文参考:《Python编程:从入门到实践(第2版)》

一、类的概念

是是一种定义对象结构的方式,它包含了属性(变量)和行为(方法),这些行为的代码可以操作这些变量。类可以看作是一个模板,用来创建具有相同属性和方法的对象实例。通过类,我们可以实例化出各种各样具体的对象

在这里插入图片描述

二、定义类

定义一个类非常简单,只需要使用 class 关键字,后面跟着类名(首字母大写),然后是冒号。类体中的代码块定义了类的属性和方法。

class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yeardef description(self):return f"{self.year} {self.make} {self.model}"

在上面的例子中,Car 是一个类,它有三个属性:makemodelyear

__init__(开头结尾都有两个下划线)方法是一个特殊的方法,被称为类的构造器,它在创建类的新实例时自动调用。在这个方法中,形参 self 必不可少。

__init__ 方法中,我们可以指定属性的默认值,下面来添加一个名为 odometer_reading 的属性,其初始值总是为 0:

class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0  # 指定属性的默认值...

注:方法的第一个参数总是 self,它代表当前对象的实例。

三、创建对象并进行访问

一旦定义了一个类,就可以使用它来创建对象。在Python中,我们使用 ClassName() 的方式来创建一个类的新实例,这时会自动调用方法 __init__,并使用提供的值来设置对象的属性。这种方式最后会返回一个对象的实例,我们再将这个实例赋值给一个变量(小写字母表示)进行存储。

my_car = Car("Toyota", "Corolla", 2020)

要访问实例的属性,使用句点表示法:对象变量.属性名

print(my_car.year)

要调用实例的方法,也使用句点表示法:对象变量.方法名()

print(my_car.description())

我们可以根据一个类创建任意数量的实例,这些实例都存储在不同的变量中,互不影响。

四、修改属性的值

方法一:句点表示法直接访问并修改

class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0  # 指定属性的默认值... my_car = Car("Toyota", "Corolla", 2020)
print(my_car.description())
my_car.odometer_reading = 23  # 直接修改属性的值
print(my_car.description())

执行结果:
在这里插入图片描述

方法二:通过方法进行修改

class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def update_odometer(self, mileage):"""将里程表读数设置为指定的值。"""self.odometer_reading = mileagedef description(self):return f"{self.year} {self.make} {self.model} {self.odometer_reading}"my_car = Car("Toyota", "Corolla", 2020)
print(my_car.description())
my_car.update_odometer(99)  # 通过方法修改
print(my_car.description())

执行结果:
在这里插入图片描述

五、继承

继承父类属性和方法

编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类,而新类称为子类。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

在既有类的基础上编写新类时,通常要调用父类的方法super().init()。这将初始化在父类__init__()方法中定义的所有属性,从而让子类包含这些属性。

super() 是一个特殊函数,让子类能够调用父类的方法。父类也称为超类 (superclass),名称 super 由此而来。

在下面的例子中,ElectricCar 类继承了 Car 类,并添加了一个新的属性 battery_size 和相应的方法。

class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0...class ElectricCar(Car):  # 注意格式def __init__(self, make, model, year, battery_size):super().__init__(make, model, year)  # 要调用父类的__init__()方法self.battery_size = battery_sizedef display_battery(self):return f"Battery size: {self.battery_size} kWh"

👉 这里有几点需要注意:

  1. 创建子类时,父类必须包含在当前文件中,且位于子类前面
  2. 定义子类时,必须在圆括号内指定父类的名称

重写父类方法

重写父类的方法时,可在子类中定义一个与要重写的父类方法同名的方法。这样,Python 将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

假设 Car 类有一个名为 fill_gas_tank() 的方法,它对全电动汽车来说毫无意义,因此你可能想重写它。下面演示了一种重写方式:

class ElectricCar(Car):-...def fill_gas_tank(self):"""电动汽车没有油箱。"""print("This car doesn't need a gas tank!")...

现在,如果有人对电动汽车调用方法 fill_gas_tank(),Python 将忽略 Car 类中的方法 fill_gas_tank(),转而运行上述代码。

使用继承时,可让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕。

六、将实例用作属性

有时可能需要将类的一部分提取出来,作为一个独立的类,这样可以将大型类拆分成多个协同工作的小类。

class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def update_odometer(self, mileage):"""将里程表读数设置为指定的值。"""self.odometer_reading = mileagedef description(self):return f"{self.year} {self.make} {self.model} {self.odometer_reading}"class Battery:"""一次模拟电动汽车电瓶的简单尝试。"""def __init__(self,battery_size=75):"""初始化电瓶的属性。"""self.battery_size = battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息。"""print(f"This car has a {self.battery_size}-kWh battery.")class ElectricCar(Car):"""电动汽车的独特之处。"""def __init__(self,make,model,year):"""初始化父类的属性。再初始化电动汽车特有的属性。"""super().__init__(make,model,year)self.battery = Battery()  # 将实例用作属性my_tesla = ElectricCar('tesla','model s',2019)
my_tesla.battery.describe_battery()

执行结果:
在这里插入图片描述

七、导入类

Python 允许将类存储在模块中,然后在主程序中导入所需的模块。

导入单个类

car.py:(模块,文件名 car 就是模块名)

"""一个可用于表示汽车的类。"""
class Car:"""一次模拟汽车的简单尝试。"""def __init__(self,make,model,year):"""初始化描述汽车的属性。"""self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述性名称。"""long_name = f"{self.year} {self.make} {self.model}"return long_name.title()def read_odometer(self):"""打印一条消息,指出汽车的里程。"""print(f"This car has {self.odometer_reading} miles on it.")def update_odometer(self,mileage):"""将里程表读数设置为指定的值。拒绝将里程表往回调。"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self,miles):"""将里程表读数增加指定的量。"""self.odometer_reading += miles

my_car.py:(主程序)

from car import Carmy_new_car = Car('audi','a4',2019)
print(my_new_car.get_descriptive_name())my_new_car.odometer_reading = 23
my_new_car.read_odometer()

执行结果:
在这里插入图片描述

从一个模块中导入多个类

car.py:(模块)

"""一组用于表示燃油汽车和电动汽车的类。"""
class Car:"""一次模拟汽车的简单尝试。"""def __init__(self,make,model,year):"""初始化描述汽车的属性。"""self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述性名称。"""long_name = f"{self.year} {self.make} {self.model}"return long_name.title()def read_odometer(self):"""打印一条消息,指出汽车的里程。"""print(f"This car has {self.odometer_reading} miles on it.")def update_odometer(self,mileage):"""将里程表读数设置为指定的值。拒绝将里程表往回调。"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self,miles):"""将里程表读数增加指定的量。"""self.odometer_reading += milesclass Battery:"""一次模拟电动汽车电瓶的简单尝试。"""def __init__(self,battery_size=75):"""初始化电瓶的属性。"""self.battery_size = battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息。"""print(f"This car has a {self.battery_size}-kWh battery.")def get_range(self):"""打印一条描述电瓶续航里程的消息。"""if self.battery_size == 75:range = 260elif self.battery_size == 100:range = 315print(f"This car can go about {range} miles on a full charge.")class ElectricCar(Car):"""模拟电动汽车的独特之处。"""def __init__(self,make,model,year):"""初始化父类的属性。再初始化电动汽车特有的属性。"""super().__init__(make,model,year)self.battery = Battery()

my_cars.py:(主程序)

from car import Car,ElectricCar  # 多个类用逗号分隔my_beetle = Car('volkswagen','beetle',2019)
print(my_beetle.get_descriptive_name())my_tesla = ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())

执行结果:
在这里插入图片描述

导入整个模块

还可以导入整个模块,再使用句点表示法访问需要的类
my_cars.py:(主程序)

import carmy_beetle = car.Car('volkswagen','beetle',2019)  # 句点表示法
print(my_beetle.get_descriptive_name())my_tesla = car.ElectricCar('tesla','roadster',2019)  # 句点表示法
print(my_tesla.get_descriptive_name())

导入模块中的所有类

from module_name import *

不推荐使用这种导入方式。这种方式可能引发名称方面的同名问题,难以诊断。

需要从一个模块中导入很多类时,最好导入整个模块,并使用 模块名.类名 语法来访问类

八、一些代码编写规范

类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。
实例名模块名都采用小写格式,并在单词之间加上下划线

对于每个类,都应紧跟在类定义后面包含一个文档字符串,简要地描述类的功能。
每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。

在类中,可使用一个空行来分隔方法。
而在模块中,可使用两个空行来分隔类。

先编写导入标准库模块的 import 语句,再添加一个空行,然后编写导入自己编写的模块的 import 语句

在这里插入图片描述

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

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

相关文章

C语言的基本输入输出函数+构造类型数据——数组

C语言的基本输入输出函数 1. 字符输入输出函数 getchar()、putchar() getchar():从标准输入(通常是键盘)读取一个字符,并返回其ASCII值。putchar():将指定的字符(由其ASCII值表示)写入标准输出…

10_Transformer预热---注意力机制(Attention)

1.1 什么是注意力机制(attention) 注意力机制(Attention Mechanism)是一种在神经网络中用于增强模型处理特定输入特征的能力的技术。它最早被应用于自然语言处理(NLP)任务中,特别是在机器翻译中,如Google的…

python14 字典类型

字典类型 键值对方式,可变数据类型,所以有增删改功能 声明方式1 {} 大括号,示例 d {key1 : value1, key2 : value2, key3 : value3 ....} 声明方式2 使用内置函数 dict() 创建1)通过映射函数创建字典zip(list1,list2) 继承了序列的所有操作 …

Linux基础I/O之文件描述符fd 重定向(上)

目录 一、预备知识 二、C语言中的文件接口 三、系统调用中的文件接口 一、预备知识 首先我们要明确的一个观点是 --- 文件 内容 属性。而且我们之前也还将过一个概念,那就是Linux下一切皆文件。 内容是数据,属性也是数据 --- 那么也就是说我…

使用STL算法函数有效提升STL列表的搜索速度(附源码)

STL(Standard Templete Library)活动模板库已被广泛地应用于各种C++程序的开发中,STL中vector、list、map等列表极大地方便了我们日常的开发,不再需要我们去实现链表等数据结构,使用这些列表能基本能解决开发过程中遇到的各种问题。网上关于STL的文章比较多,今天我们就来…

代码随想录——组合总和Ⅱ(Leetcode 40)需要回顾

题目链接 回溯 本题的难点在于:集合(数组candidates)有重复元素,但还不能有重复的组合。 思想:元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。所以要去重的是同一树…

统计套利—配对交易策略

配对交易是一种基于统计学的交易策略,通过两只股票的差价来获取收益,因而与很多策略不同,它是一种中性策略,理论上可以做到和大盘走势完全无关。 配对交易的基本原理是,两个相似公司的股票,其股价走势虽然在…

[Linux] TCP协议介绍(3): TCP协议的“四次挥手“过程、状态分析...

TCP协议是面向连接的 上一篇文章简单分析了TCP通信非常重要的建立连接的"三次握手"的过程 本篇文章来分析TCP通信中同样非常重要的断开连接的"四次挥手"的过程 TCP的"四次挥手" TCP协议建立连接 需要"三次握手". "三次挥手&q…

基于STM32和人工智能的自动驾驶小车系统

目录 引言环境准备自动驾驶小车系统基础代码实现:实现自动驾驶小车系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:自动驾驶应用与优化问题解决方案与优化收尾与总结 1. 引言 随着人工智能和嵌入式系统技术的…

稀疏矩阵是什么 如何求

稀疏矩阵是一种特殊类型的矩阵,其中大多数元素都是零。由于稀疏矩阵中非零元素的数量远少于零元素,因此可以使用特定的数据结构和算法来高效地存储和处理它们,从而节省存储空间和计算时间。 RowPtr 数组中的每个元素表示对应行的第一个非零元…

变压器纵联差动保护的Simulink仿真

利用Simulink在变压器空载合闸励磁涌流的仿真模型的基础上将变压器改为采用Yd11联结且不考虑饱和特性,增加外部故障模块Fault2,得到新的仿真模型如图1所示。 图1 变压器的Simulink仿真模型 在建立模型时,请注意三相电压电流测量模块Um,UN的方向。比率制动特性纵差保护…

目标检测算法SSD与FasterRCNN

目标检测算法SSD与FasterRCNN SSD:( Single Shot MultiBox Detector)特点是在不同特征尺度上预测不同尺度的目标。 SSD网络结构 首先对网络的特征进行说明:输入的图像是300x300的三通道彩色图像。 网络的第一个部分贯穿到Vgg16模型 Conv5的…

工厂方法模式实战之某商场一次促销活动

目录 1.5.1、前言1.5.2、实战场景简介1.5.3、开发环境1.5.4、用传统的if-else语句实现1.5.4.1、工程结构1.5.4.2、if-else需求实现1.5.4.3、测试验证 1.5.5、工厂模式优化代码1.5.5.1、工程结构1.5.5.2、代码实现1.5.5.2.1、定义各种商品发放接口及接口实现1.5.5.2.2、定义工厂…

Android开发系列:高性能视图组件Surfaceview

一、Surfaceview概述 在Android应用开发领域,面对视频播放、游戏构建及相机实时预览等高性能需求场景,直接操控图像数据并即时展示于屏幕成为必要条件。传统View组件在此类情境下显现局限性: 性能瓶颈:传统View的绘制任务由UI主…

Spring系统学习 -Spring IOC 的XML管理Bean之类类型属性赋值、数组类型属性赋值、集合类属性赋值

类类型属性赋值&#xff1a; 在XML配置中&#xff0c;可以使用 <property> 元素为类类型属性赋值。通过指定属性的名称和值&#xff0c;可以直接将其他Bean的实例引用注入到目标Bean的属性中。这种方式可以建立对象之间的关联关系。例如&#xff0c;可以将一个Address对象…

Element-UI - 解决el-table中图片悬浮被遮挡问题

在开发中&#xff0c;发现element-ui在el-table中添加图片悬浮显示时&#xff0c;会被单元格遮挡的问题。通过查询得到的解决办法&#xff0c;大多是修改.el-table类中相关样式属性&#xff0c;但经过验证发现会影响到其他正常功能的使用。对于此问题解决其实也并不难&#xff…

生产者消费者模型的同步与互斥:C++代码实现

文章目录 一、引言二、生产者消费者模型概述1、基本概念和核心思想2、生产者消费者模型的优点 三、消费者和生产者之间的同步与互斥四、代码实现1、事前准备2、环形队列的实现3、阻塞队列的实现4、两种实现方式的区别 一、引言 在现代计算机系统中&#xff0c;很多任务需要同时…

【机器学习】机器学习与教育科技在个性化教学中的融合应用与性能优化新探索

文章目录 引言机器学习与教育科技的基本概念机器学习概述监督学习无监督学习强化学习 教育科技概述学生学习行为分析个性化学习路径推荐智能化教育评估 机器学习与教育科技的融合应用实时学习数据分析数据预处理特征工程 学生成绩预测与优化模型训练模型评估 个性化学习路径推荐…

【AI实践】Ollama本地安装大模型服务

Ollama安装运行 安装与配置 Download Ollama 安装默认在C盘&#xff0c;成功后&#xff0c;window任务栏图标会有Ollama Logo 为了不占用C盘更大的空间&#xff0c;修改模型下载路径&#xff0c;修改环境变量 下载模型 由于我电脑是第六代Intel&#xff0c;集显&#xff0c;…

【算法题】搜索二维矩阵,一文彻底弄会!

目录 一、题目描述 二、解题思路 1、引言 2、思路推导过程 三、参考答案 一、题目描述 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数…