python的类如何使用?兔c同学一篇关于python类的博文概述

news2024/11/17 21:24:56

本章内容如目录 所示:

文章目录

        • 1. 创建和使用类
          • 1.1 创建第一个python 类
          • 1.2 版本差异
          • 1.3 根据类创建实例
            • 1. 访问属性
            • 2. 调用方法
            • 3. 创建多个实例
        • 2. 使用类和实例
          • 2.1 给属性指定默认值
          • 2.2 修改属性的值
        • 3. 继承
          • 3.1 子类的 __init __()
          • 3.2 给子类定义属性和方法
          • 3.3 重写父类的方法
          • 3.4 将实例用作属性
        • 4. 导入类
          • 4.1 导入单个类
          • 4.2 在一个模块中存储多个类
          • 4.3 在一个模块中存储多个类
          • 4.4 导入整个模块
          • 4.5 导入模块中的所有类


导言
面向对象编程是最有效的软件编写方法之一。在面向对象编程中你编写表示显示世界中的事务和情景类,并基于这些类来创建对象。
编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。
根据类来创建对象被称为实例化,这让你能够使用类的实例。
.
.在本章中,你将编写一些类并创建其实例。你将指定可在实例中存储什么信息,定义可对这些实例执行哪些操作。你还将编写一些类来扩展既有类的功能,让相似的类能够高效地共享代码。还可以将自己编写的类存储在模块中,并在自己的程序文件中导入其他程序员编写的类。


1. 创建和使用类

1.1 创建第一个python 类

使用类几乎可以模拟任何东西。下面我们来编写一个简单的 小狗 dog 类,它表示的不是某个特定的小狗,而是任何小狗,它具备姓名,年龄,还有属于小狗的某种行为。

现在我们来编写这个表示小狗的类:

# 创建小狗类
class Dog():
 #初始化函数
	def __init__(self,name,age):
 
 		#self 这个参数代表 当前对象的实例本身,
 			#所以通过self 来调用,self不是固定关键词,可以起成任意一个名字
 			#在类当中定义的所有函数的第一个参数都是 当前对象实例的本身
 		self.name = name
 		self.age = age

	#定义狗子 蹲下函数
  	def sit(self):
  		print("狗子:"+self.name+",现在已经蹲下来了....")

	#定义狗子 打滚函数
	def roll_over(self):
		print("狗子:"+self.name+"正在打滚....")

现在我们已经创建好了一个简单的 python 类,

在python 中,类的名称是以大写字母开头的,类定义中的括号是空的,因为我们要从空白创建这个类。


关于 __ init __() 方法:

在类中的函数称为方法;我们前面学到的有关函数的一切都适用于方法,需要注意的有差别的一点是:调用方法的方式。
__ init __() 是一个特殊的方法,每当我们根据 Dog 类创建实例时, python 都会自动运行它。在这个方法的名称中,开头黑末尾各有两个下划线,这是一种约定:旨在避免 python 默认方法与普通方法发生名称冲突。

关于 self 参数具体说明

在__ init ()方法中,我们一共定义了三个参数:self、name、age。 形参 self
是必不可少的,且必须位于参数列表的最前面。为何必须定义 self 形参呢? 因为 python 调用这个
init __()
方法来创建Dog类的实例时,将自动传入 实参self,每个与类相关的方法调用都自动传递实参
self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。


通过实例访问的变量称为属性。

1.2 版本差异

在 python 2.+ 的版本定义类的语法:

class Dog(object):

在 python 3.+ 的版本定义类的语法:

class Dog():

1.3 根据类创建实例

我们可将类视为有关如何创建实例的说明。Dog类是一系列说明,让 python 知道如何创建表示特定小狗的实例:

class Dog():
 #初始化函数
	def __init__(self,name,age):
 
 		#self 这个参数代表 当前对象的实例本身,
 			#所以通过self 来调用,self不是固定关键词,可以起成任意一个名字
 			#在类当中定义的所有函数的第一个参数都是 当前对象实例的本身
 		self.name = name
 		self.age = age

	#定义狗子 蹲下函数
	def sit(self):
  		print("狗子:"+self.name+",现在已经蹲下来了....")

	#定义狗子 打滚函数
	def roll_over(self):
		print("狗子:"+self.name+"正在打滚....")

# Dog类的实例创建过程
my_dog = Dog('小白',4)
print('我的小狗叫:'+my_dog.name+',它今年'+str(my_dog.age)+'岁')

通常:类的命名以大写字母开头,而类的实例以小写字母开头。

1. 访问属性

想要访问实例的属性,可使用句点表示法。
例如在上述代码当中:

my_dog.name

就是对属性的使用。
句点在 python 当中很有用,在这个调用过程当中,python 会先找到实例 my_dog。在查找与这个实例相关联的属性 name。
在 Dog 类中引用这个属性时,使用的是 self.name。我们也使用同样的方法来获取属性 age 的值。

2. 调用方法

Dog类创建实例后,就可以使用句点表示法来调用 Dog类中定义的任何方法。
下面我们来调用 小狗打滚和蹲下的方法。

my_dog.sit()
my_dog.roll_over()

在这里插入图片描述

3. 创建多个实例

一个类 可以对应多个实例,实例并非只有一个。类是抽象的概念,
比如小狗,小狗可能有多只,可能是小白,小黑,小黄。它们都是小狗,所以一个类,
可以创建多个实例。

例如,我的小狗 我会将代码写成:

my_dog = Dog()

而你也有一只小狗,我还可以继续使用这个类进行实例化。

your_dog= Dog()

至于你的小狗叫什么名字,我的小狗叫什么名字,它们年龄是几岁?
直接通过变量名调用属性,给它们赋值就行了。
或者你也可以将参数写在括号里,通过 初始化方法进行赋值。


2. 使用类和实例

现在我们来编写一个表示汽车的类,使其存储有关汽车的信息。

class Car():
	#初始化方法
	def __init__(self,model,colour):
		self.model =model
		self.colour =colour

	#小汽车的基本信息描述
	def get_carInfo(self):
		info = '它是一辆'+self.colour+'颜色的'+self.model+'车'
		return info
		
		
my_car = Car('BMW','白') 
print(my_car.get_carInfo())

我们看一下这段代码的运行结果。
在这里插入图片描述


一个基本的 汽车类的模板,我们就定义好了,下面我们利用新的知识,不断对模板进行改进。

2.1 给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是 0 或 空的字符串。
在有些情况下,设置默认值时, 在 初始化方法内 指定初始值也是可行的。

如果对某个属性这样设置了,就无需包含为它提供初始值的形参。

给小汽车添加 里程的属性。

class Car():
	#初始化方法
	def __init__(self,model,colour,mileage):
		self.model =model
		self.colour =colour
		self.mileage = 0

	#小汽车的基本信息描述
	def get_carInfo(self):
		info = '它是一辆'+self.colour+'颜色的'+self.model+'车'
		return info
		
	# 小汽车的行驶里程记录
	def get_carMileage(self):
		print('该汽车已经行驶了:'+'self.mileage'+'公里')

设置好了小汽车的模板,我们在来生产一辆崭新的黑色大众汽车。

my_car = Car('大众','黑')
print(my_car.get_carInfo())
print(my_car.get_carMileage())
2.2 修改属性的值

刚才我们给属性设置了默认值,而这里给大家介绍三种修改属性值的方法:

一种是 通过实例进行修改,

对属性的值,直接进行修改,最简单的方式是通过实例直接访问它。
以上面的小汽车类举例。

# 实例化一个新的小汽车
new_Car = Car('大众汽车','黑')
#获取该小汽车的信息
print(new_Car.get_carInfo())

#现在,我们将小汽车颜色修改为 白色
new_Car.colour ='白'
#重新获取该小汽车的信息
print(new_Car.get_carInfo())

接下来,我们看一下修改后的输出信息:
在这里插入图片描述
我们看到小汽车的参数值已经修改成功了。

一种是 通过方法进行设置,

如果有更新属性的方法,可以将参数值传递给方法,无需在直接访问属性。
因为此时的参数值会在该方法的内部进行更新。

#计算小汽车里程数信息的方法
def update_CarInfo(self,mileage):
	self.mileage=mileage
'''该方法被调用时,接收调用处传递的实参,将该参数重新赋值到计录里程变量中'''

#下面正常创建小汽车类
new_car =Car('大众汽车','黑色')
print(new_car.get_carInfo())
#得到小汽车信息以后,在调用获取里程数方法,查看里程
print(new_car.get_carMileage())

#经过一段时间的驾驶后,通过小汽车里程更新方法更新它的里程
new_car.update_CarInfo(20)
#重新打印小汽车的里程数
print(new_car.get_carMileage())

写好代码以后,我们来输出查看小汽车的里程数:
在这里插入图片描述
发现小汽车的里程数已经更新到20公里了。

一种是 通过方法进行递曾。

有时候我们需要给属性值传递特定的量,而不是将其设置为全新的值。
就像小汽车的里程,总是在增加的。

我们写一个实例来说明如何传递这个增量。

#设置小汽车里程增量方法
def increment_mileage(self,miles):
	self.mileage+=miles

#购买新的小汽车
new_car = Car("大众甲壳虫",'黄')

#每日用车 10公里,设置没人增加里程
new_car.increment_mileage(10)

#获取小汽车的信息
print(new_car.)

我们来看一下程序的执行结果:
在这里插入图片描述

3. 继承

编写类时,不一定总是从零开始,如果你要编写的类是另一个现成类的特殊版本。
可以使用继承,一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;

原有的类称为父类,而新的类被称为子类。
子类会继承父类的所有属性和方法,同时还可以定义自己的属性和方法。

3.1 子类的 __init __()

创建子类的实例时,python 首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init __() 需要父类施以援手。

例如我们创建一个电动汽车类,电动汽车是一种特殊的汽车,因此我们可以基于前面创建的 Car类,创建一个新的类。这样我们就只需要为电动汽车特有的属性和行为编写代码。

#电动汽车类
class ElectricCar(Car):
	def __init__(self,model,colour):
		super().__init__(model,colour)

#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())

这里需要注意,创建子类时,必须要在同一个文件内有父类的代码包含其中。
在这个示例中,没写父类代码是因为省略了。
而且父类的代码必须位于子类代码的前面。

现在我们来运行一下这段程序代码,
看看子类是否成功继承父类了,并且是否可以成功调取到父类的方法。
在这里插入图片描述

关于 super() 方法的说明:
super() 是一个特殊的函数,帮助python将父类和子类关联起来。
super().init(model,colour) 这行代码,让python 调取 ElecticCar 的父类的方法 __init __(),让其子类也包含其父类的所有属性。

3.2 给子类定义属性和方法

让一个类继承另一个类以后,可添加区分子类和父类所需的新属性和方法。
下面我们来给子类添加一个独有的显示电动汽车的 电池相关描述的属性和方法。

#电动汽车类
class ElectricCar(Car):
		
	def __init__(self,model,colour):
		super().__init__(model,colour)
		self.battery_size = 60
	#电池汽车信息状态
	def describe_battery(self):
		print('您汽车的电池能源剩余:'+str(self.battery_size))

#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
#显示电池状态
print(eCar.describe_battery())

其实在这段代码当中,跟我们之前设置属性的初始化参数时意思相同,不同的是这次的默认值是设置在子类当中,而父类没有这个方法。其实本质还是对默认值的一个设置和使用。在初始化方法中新添加一个独有的属性,然后设置好默认值。在新定义一个显示电池信息状态的方法,在这个方法中调到独有属性。最后,哪里实例化子类,调用这个方法,就会在哪里成功显示出电池信息。

在这里插入图片描述

3.3 重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可以对其进行重写。

在我们编写的父类代码当中,这个方法 大家还记不记得?

# 小汽车的行驶里程记录
	def get_carMileage(self):
		print('该汽车已经行驶了'+str(self.mileage)+'公里')

我们就用这个方法来做重写的测试,

在汽车中,里程数是不断记录的。而在电动车中,我们将其重写成另一种记录形式:

#电动汽车类
class ElectricCar(Car):
		
	def __init__(self,model,colour):
		super().__init__(model,colour)
		self.battery_size = 60
	#汽车电池信息状态
	def describe_battery(self):
		print('您汽车的电池能源剩余:'+str(self.battery_size))
		
	#电动车的行驶里程记录
	def get_carMileage(self):
		print('该汽车电池已消耗:'+str(self.mileage)+'公里')


#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
#显示电池状态
print(eCar.describe_battery())

#别忘了调用一下修改 里程数的方法
eCar.update_CarInfo(10)
#调用  动车的行驶里程记录
print(eCar.get_carMileage())

现在我们来看一下输出结果,看看子类重写父类的方法是否成功?
在这里插入图片描述

3.4 将实例用作属性

使用代码模拟事务时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型的类拆分成多个协同工作的小类。

例如,不在给电动汽车类添加细节,我们可能会发现其中包含很多专门针对汽车点评的属性和方法。在这种情况下,我们可将这些属性和方法提取出来,放到另一个名为 Battery的类中,并将一个Battery实例用作 ElectricCar类的一个属性:

其实就是将属性封装到一个类里,然后在将这个类作为 本类的属性。

class Battery():
	def __init__(self,battery_size=60):
		#初始化电池信息
		self.battery_size=battery_size
	
	#汽车电池信息状态
	def describe_battery(self):
		print('您汽车的电池能源剩余:'+str(self.battery_size))

#创建电动汽车类
class ElectricCar(Car):
	def __init__(self,model,colour):
		super().__init__(model,colour)
		self.battery = Battery()

#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
#显示电池状态
print(eCar.battery.describe_battery())

其实这里并没有改动代码的逻辑,只是将一些属性进行了封装,当然这是 java中的概念,简单来说,就是将 某个类的 过多属性 或者是方法 定义到一个类中,在将这个类作为 我们要操作类的属性,通过这个属性来操作繁多的内容。

我们来看一下输出结果:
在这里插入图片描述

4. 导入类

随着不断给类添加功能,文件可能变的很长,即便妥善地使用了继承亦然如此。为遵循python的总体理念,应让文件尽可能整洁。为在这方面提供帮助, python 允许你将类存储在模块中,然后在主程序中导入所需的模块。

4.1 导入单个类
from 文件名 import 类名 
4.2 在一个模块中存储多个类

虽然在一个模块当中的类应该存在相关性,但也可以根据需要在一个模块中存储任意数量的类。

from 文件名 import 之类名 #同时可以调用与该类的相关的类,如 父类,封装的属性和方法的类
4.3 在一个模块中存储多个类

可以根据需要在程序文件中存储任意多个类

from 文件名 import 类名,类名 #用小写逗号分隔
4.4 导入整个模块

也可以导入整个模块,然后在通过句点表示法访问需要的类。

import 文件名
4.5 导入模块中的所有类
from module_name模块名 import *

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

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

相关文章

《如何有效阅读》藤原和博 读书笔记

感想 1、整本书内容零散: 主旨是如何有效阅读,但是阅读方法不成系统,更像是零散的想法,或者说是作者想到什么就写什么。第一遍读完以后,大脑里没有什么整体思路,觉得作者说的有道理,但是没有实…

Django 模型层及ORM介绍二

数据库迁移文件混乱的解决方法 数据库中django_migrations表记录了migrate的‘全过程’,项目各应用中的migrate文件与之对应,否则migrate会报错解决方案: 1、删除所有migrations里所有的000?_xxxx.py(__init__.py除外&#xff09…

【模拟集成电路】环路滤波器(LPF)设计

环路滤波器 LPF 设计 前言环路滤波器设计仿真结果各部分链接链接:前言 本文主要内容是对环路滤波器 模块设计设计进行阐述,LPF在电荷泵频率综合器中,主要作用是进行滤波,消除毛刺,因此一个简单的RC就可以起到很好的效果…

软件设计的“SOLID”五大原则

一、单一职责 1、定义 单一职责原则(single Responsibility Principle,SRP)规定,每一个软件单元,其中包括组件、类和函数,应该只有一个单一且明确定义的职责。 2、特点 一个类应该仅有一个引起它变化的原因&#x…

JavaScript HTML DOM 改变 HTML

文章目录JavaScript HTML DOM 改变 HTML改变 HTML 输出流改变 HTML 内容改变 HTML 属性JavaScript HTML DOM 改变 HTML HTML DOM 允许 JavaScript 改变 HTML 元素的内容。 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu …

JDBC-API详解、SQL注入演示、连接池

文章目录JDBC1,JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2,JDBC快速入门2.1 编写代码步骤2.2 具体操作3,JDBC API详解3.1 DriverManager3.2 Connection (事务归我管)3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

SQL语句 -非空约束 - 唯一约束 - 主键约束 - 默认约束 -外键约束

文章目录约束约束介绍和分类非空约束唯一约束主键约束默认约束案例练习外键约束约束 约束介绍和分类 约束的概念: 约束是作用于表中列上的规则,用于限制加入表的数据 约束的存在保证了数据库中数据的正确性、有效性和完整性 约束的分类如下: 约束名称描述关键字非…

代码随想录【Day25】| 216. 组合总和 III、17. 电话号码的字母组合

216. 组合总和 III 题目链接 题目描述: 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输…

从中国文化看面试挑人标准

文章目录标准一、面相1. 1 四白眼1.2 浓眉二、讲话2.1 言多与气虚总结本文结合中国面相,是个概率性问题,对于个体无效。 标准 正直,三观正,沟通好,技术。从概率上讲: 正直且三观正的人----有恒心&#x…

Python带你制作一个属于自己的多功能音乐播放器

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 就是用Python做一个简易的音乐播放器,废话不多说,咱们直接开干 当然,今天做这个肯定不是最简单的,最简单的音乐播放器,9行代码足以 完整源码等直接在文末名片领…

剑指 Offer 08. 二叉树的下一个结点

摘要 二叉树的下一个结点_牛客题霸_牛客网 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节…

【SpringBoot】简单的文件上传和文件下载以及图片回显

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&#…

k8s全解

目录说明Kubernetes介绍应用部署方式演变kubernetes简介kubernetes组件kubernetes概念kubernetes集群环境搭建安装方式kubeadm二进制包集群类型安装要求最终目标准备环境环境初始化服务部署kubeadm中的命令(一般用不着)资源管理YAML语言介绍资源管理方式命令式对象管理kubectl命…

【涨薪技术】0到1学会性能测试 —— 参数化关联

前言 上一次推文我们分享了性能测试工作原理、事务、检查点!今天给大家带来性能测试参数化,检查点知识!后续文章都会系统分享干货,带大家从0到1学会性能测试,另外还有教程等同步资料,文末免费获取~ 01、性…

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&am…

python语音识别whisper

一、背景 最近想提取一些视频的字幕,语音文案,研究了一波 二、whisper语音识别 Whisper 是一种通用的语音识别模型。它在不同音频的大型数据集上进行训练,也是一个多任务模型,可以执行多语言语音识别以及语音翻译和语言识别。 …

Chat Support Board WordPress聊天插件 v3.5.8

功能列表 支持和聊天功能 Slack聊天完全同步 - 直接从Slack发送和接收用户信息。 立即工作 - 只需插入短码,即可立即安装和使用。 丰富的信息 - Dialogflow机器人发送丰富的信息。 机器人--集成一个由API.AI驱动的多语言机器人。 电子邮件通知 - 当收到回复时&#…

JUC 之 比较交换 CAS

—— CAS(Compare And Swap) 没有 CAS 之前,多线程环境下不使用原子类保证线程安全 i,只能通过 synchronized 加锁的方式,高并发多写情况下,性能影响很大;使用 CAS 之后,可以使用原子…

公司对不同职级能力抽象要求的具体化

要先把当前级别要求的能力提升到精通,然后尝试做下一级别的事情。 但可能不确定高一级的能力要求究竟怎样,不同Title,如“工程师”“高级工程师”和“资深工程师”等。但这样 Title 对我们理解不同级别的能力要求,完全无用。“高…

RecycleView详解

listview缓存请看: listview优化和详解RecycleView 和 ListView对比:使用方法上ListView:继承重写 BaseAdapter,自定义 ViewHolder 与 converView优化。RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 Layou…