Python中__面向对象__学习 (上)

目录

一、类和对象

1.类的定义

2.根据对象创建类

二、构造和析构

1.构造方法

(1)不带参数的构造方法

(2)带参数的构造方法

2.析构方法

三、重载

1.定制对象的字符串形式

(1)只重载__str__方法

(2)只重载__repr__方法

(3)重载__str__和__repr__方法

2.运算符重载

(1)加法运算重载

(2)索引和分段重载

一、类和对象

1.类的定义

类是创建对象的基础模板。它为对象提供了创建的要求。类由以下三部分组成:

(1)类名: 类的名称,它的首字母必须是大写,如:Cat

(2)属性: 定义属性(变量)用于描述事物的特征,比如:人的姓名、年龄等特征是类中定义的数据。

(3)方法: 方法(函数)用于描述事物的行为,比如,人会说话、微笑等类的行为。

示例:

上述例子中,我们定义了一个Cat的类,类的对象的参数固定第一个self,self代表类的对象自己,后面可引用对象的属性和方法,self 可以有‘类属性’和‘实例属性’。

所谓类属性,即:由类的所有实例共享。它们在类定义的顶部声明,不需要使用 self 参数。

所谓实例属性,即:属于类的每个特定实例,每个实例都有独自的属性内容。它们在类的初始化方法 __init__ 中 通过使用 self 参数来声明。

例子中的move、jump、index都是实例属性。

类属性示范:

class Cat:black = "black cat detective"  # 这里black是类属性

2.根据对象创建类

格式如下:

对象名 = 类名(自定义参数)

# 创建一个对象,并对该变量对象保持引用
tom = Cat(2,1)

紧接着给对象加属性的格式:

对象名 . 新的属性值  =  值

# 添加 颜色 属性
tom.color = '橘色'

完整栗子:

class Cat:  # 定义一个Cat父类def __init__(self, move, scratch):self.move = move  # 给Cat类增加move属性的构造方法self.scratch = scratch  # 将参数scratch赋值给scratch属性# 实例属性 indexself.index = {'weight': f'{0.5}kg', 'height': f'{5} cm'}# 创建一个对象,并对该变量对象保持引用
tom = Cat(2, 1)# 给创建好的对象增加额外的属性
tom.color = '橘色'# 访问属性
print("一只" + tom.color + "的猫干的好事!")
print("打碎杯子:", tom.move)
print("抓坏枕头:", tom.scratch)
print(tom.index)

二、构造和析构

1.构造方法

如果每创建一个类的对象,建一个对象,还想就添加一次属性,这样显然非常麻烦。

为此Python 提供了一个构造方法来解决这个问题,可以在创建对象的时候就设置多个属性。该方法就是上面用到的 __init__ (两个下划线开头、两个下划线结尾),当创建类的实例属性时,系统会自动调用构造方法,从而实现对类进行初始化的操作。

(1)不带参数的构造方法

即:就单独一个(self)。示范:

class Car:# 不带参数的构造方法def __init__(self):self.color = '黑色'def wait(self):print(f"一辆{self.color}的车在等候...")car = Car()
car.wait()
(2)带参数的构造方法

有时属性值一样,不利于构造的扩展。所以通过传入参数来修改属性的值就很方便。

示范:

class Car:# 带参数构造方法def __init__(self, color):self.color = color# 鸣笛def toot(self):print(f"{self.color}色的车在鸣笛...")# 等候def wait(self):print(f"{self.color}色的车在等候...")# 对象1
BMW = Car("白")
# 对象2
TOYOTA = Car("灰")
# 开始调用
BMW.toot()
TOYOTA.wait()

2.析构方法

当一个对象的运行周期结束时,Python 解释器会通过调用__del__()的方法删除调用的对象,来释放内存资源,这样的方法称为‘析构’。

继续上面的例子(带有析构):

class Car:# 带参数构造方法def __init__(self, color):self.color = color# 鸣笛def toot(self):print(f"{self.color}色的车在鸣笛...")# 等候def wait(self):print(f"{self.color}色的车在等候...")'''根据python自动回收垃圾机制会自动删除周期结束的对象并释放内存空间'''def __del__(self):print("-------")# 对象1
BMW = Car("白")
# 对象2
TOYOTA = Car("灰")
# 开始调用
BMW.toot()
TOYOTA.wait()del BMW  # 手动删除调用的对象1,释放内存空间
print("BMW对象已被删除")
del TOYOTA  # 手动删除调用的对象2,释放内存空间
print("TOYOTA对象已被删除")

总之,处理多个对象或者有循环调用对象时,析构是个方法。并且Python会在对象生命周期结束时自动进行垃圾回收,所以有时我们可以不需要显式的定义__del__方法。

三、重载

重载通常指的是能够定义多个同名函数,但是它们的参数列表(类型或数量)不同。Python本身不支持函数重载的语法,因为它是动态类型的语言,参数的类型在运行时确定。不过,可以通过默认参数值、可变参数(不定长参数)或使用装饰器等方式来模拟类似重载的行为。

与“重载”相比,重写发生在继承体系中,子类中的方法与父类中同名方法具有相同的参数列表和返回类型。子类通过重写方法来提供特定的实现,覆盖父类的行为。

1.定制对象的字符串形式

(1)__str__实例方法

使用__str__方法,即:能让print打印出调用的参数结果,例:

class Vehicle:def __init__(self, price, fuel_consumption):# 给初始化的参数赋值给实例的属性self.price = priceself.fuel_consumption = fuel_consumption# 重载方法def __str__(self):  # 将对象转换为字符串时能被自动调用return f"售价:{self.price}  油耗:{self.fuel_consumption}"su7 = Vehicle("22万", 0)  # 创建一个Vehicle的实例,传递22万、0 参数print(su7)

// ^-^ 

如果没有写__str__实例方法:

 就只会显示对象所在的地址(这并不是我们所想要的结果)

(2)__repr__实例方法

重载 __repr__ 方法,可以保证各种操作下都能正确获得实例对象自定义的字符串形式。与__str__方法相比, __repr__ 用于获取对象的字符串表示时,通常用于开发者调试。当使用__repr__ ()函数或在交互式解释器中打印对象时,__repr__方法被调用。__repr__应该返回一个字符串,且该字符串应该是一个有效的Python表达式,能够重新创建该对象。

示例:

(3)__str__和__repr__实例方法

总之,__str__和__repr__ 都能对自定义对象返回有效的字符串形式。

2.运算符重载

Python 中的运算符重载是一种特殊的多态性形式,运算符重载让我们能够对自定义的对象使用熟悉的运算符,如加法(+)、减法(-)、乘法(*)等。

就比如以下代码,我们给加号赋予一个作用:

class Shop:def __init__(self, price, bonus_point):self.price = priceself.bonus_point = bonus_point# 通过两个对象的相加,返回到类中def __add__(self, other):return Shop(self.price + other.price,self.bonus_point + other.bonus_point)def __str__(self):  # 确保能返回我们自定义的字符串return f"消费金额:{self.price},奖励积分:{self.bonus_point}"def __repr__(self):  # 保证各种操作下都能让自定义对象有字符串形式return f"消费金额:{self.price},奖励积分:{self.bonus_point}"nanfu_battery = Shop(9, 0.5)
air_conditioning = Shop(6999, 100)# 这里就是通过自定义对象的相加给‘+’运算符 赋予的功能
total = nanfu_battery + air_conditioningprint(total)

在 Python 中,运算符重载通过在类中定义特殊方法来实现。这些特殊方法以双下划线开始和结束,例如__add__、__sub__、__mul__等,常见的如下:

(1)加法运算重载

当两个实例对象进行加法时,自动调用__add__方法,例:

class Vector:  # 定义一个 Vector(向量)的类# 构建函数,通过[:]切片复制一个新对象,而不影响原来的对象def __init__(self, other):self.data = other[:]# 加法重载def __add__(self, other):# 计算 self.data 和 other.data 的长度的最小值min_len = min(len(self.data), len(other.data))# 创建一个变量,用于存放结果result_list = []# 遍历两个列表的最小长度for i in range(min_len):result_list.append(self.data[i] + other.data[i])# 判断哪个列表更长,并添加剩余的元素if len(self.data) > min_len:result_list.extend(self.data[min_len])elif len(other.data) > min_len:result_list.extend(other.data[min_len])# 返回包含相加的结果return Vector(result_list)# 创建Vector(向量)类的两个实例
one = Vector([4, 5])
two = Vector([6, 7])demo_sum = one + twoprint("相加结果:", demo_sum.data)

其实、在单纯的调用运算符重载的计算中,主要是要考虑好计算的边界问题就行吧.......(好难啊!)

(2)索引和分段重载

索引和分片相关的重载方法主要包括以下三个:

示例:

class MyList:# 先构造一个初始化函数def __init__(self, initial_data):self.data = initial_data# 定义索引、分片的重载def __getitem__(self, key):return self.data[key]# 定义索引、分片赋值的重载def __setitem__(self, key, value):self.data[key] = value# 删除索引、分片的重载def __delitem__(self, key):del self.data[key]# 使用repr函数用来返回self.data字符串形式def __repr__(self):return repr(self.data)# 创建一个实例
list = MyList([1, 2, 3, 4, 5])print(list[1])  # 索引出位置1的值
print(list[:])  # 分片返回列表全部的值
print(list[1:3])  # 分片位置1-3(不含)的值print("-"*20)  # 一条分割线...list[1] = 10  # 将索引1的元素改为10
list[2:4] = [8, 9]  # 将索引2到3的元素替换为[8, 9]print(list)  # 输出新的列表print("-"*20)  # 一条分割线...del list[1]  # 删除索引1的元素
del list[1:3]  # 删除索引1到2的元素print(list)  # 再输出新的列表

P.S.

端午假期愉快!\(*^▽^*)/

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

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

相关文章

QT Udp广播实现设备发现

测试环境 本文选用pc1作为客户端,pc2,以及一台虚拟机作为服务端。 pc1,pc2(客户端): 虚拟机(服务端): 客户端 原理:客户端通过发送广播消息信息到ip:255.255.255.255(QHostAddress::Broadcast),局域网…

了解Java内存模型(Java Memory Model, JMM)

了解Java内存模型(Java Memory Model, JMM) Java内存模型(Java Memory Model, JMM)是Java语言规范中规定的一组规则,定义了多线程程序中变量(包括实例字段、静态字段和数组元素)的访问方式。JM…

git 大文件上传失败 Please remove the file from history and try again.

根据提示执行命令 --- 查找到当前文件 git rev-list --objects --all | grep b24e74b34e7d482e2bc687e017c8ab28cd1d24b6git filter-branch --tree-filter rm -f 文件名 --tag-name-filter cat -- --all git push origin --tags --force git push origin --all --force

Fort Firewall防火墙工具v3.12.13

软件介绍 Fort Firewall是一款开源系统的免费防火墙,体积小巧、占用空间不大,可以为用户的电脑起到保护作用,该软件可以控制程序访问网络,控制用户的电脑网速,用户可以更轻松便捷的进行网络安全防护,保护系…

c# Attribute特性示范

[MyCustomAttribute("Example")] 中括号写在类前,表示此类具有此特性。 ”property” 译为“属性 Attribute用特性描述 using System;// 定义一个自定义特性 public class MyCustomAttribute : Attribute {public string Value { get; set; }public My…

什么是镜像源

镜像源在计算机领域中是一个重要的概念,下面我将用分点的方式清晰解释镜像源的定义、作用以及特点: 1. 定义 镜像源(Mirror):是一个服务器,它存储了另一个服务器上的某些或全部内容的副本。这些内容可以包…

Sony前端连接功放:深度解析与实用指南

Sony前端连接功放:深度解析与实用指南 在音响设备连接中,Sony前端与功放的连接常常是一个令人困惑却又至关重要的环节。本文将从四个方面、五个方面、六个方面和七个方面详细解析Sony前端连接功放的步骤、技巧及注意事项,旨在帮助读者轻松完…

计算机网络 —— 网络层(IP数据报)

计算机网络 —— 网络层(IP数据报) 网络层要满足的功能IP数据报IP数据报格式IP数据报首部格式数据部分 IP数据报分片 我们今天进入网络层的学习。 网络层要满足的功能 网络层作为OSI模型中的第三层,是计算机网络体系结构的关键组成部分&…

实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》

你有没有发现,困的时候真的清醒不了。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后,您应该能够确定给定 IP 地址和子网掩码的子网信息。 知道 IP 地址、网络掩码和子网掩码后,您应该能够确定有关该 IP 地…

SpringBoot实现参数校验拦截(采用AOP方式)

一、AOP是什么? 目的:分离横切关注点(如日志记录、事务管理)与核心业务逻辑。 优势:提高代码的可读性和可维护性。 关键概念 切面(Aspect):包含横切关注点代码的模块。通知&#xff…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 运输时间(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 运输时间(200分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

【面试干货】索引的优缺点

【面试干货】索引的优缺点 1、创建索引可以大大提高系统的性能(**优点**)2、增加索引也有许多不利的方面(**缺点**) 💖The Begin💖点点关注,收藏不迷路💖 1、创建索引可以大大提高系…

LiDAR360MLS 7.2.0 雷达点云数据处理软件功能介绍

新增模块和功能: 支持手持、背包数据的解算 SLAM解算成功率提升 SLAM解算效率提升 采集端与后处理端保持一致 赋色优化 新增平面图模块 新增平面图全自动矢量化功能 新增平面图矢量一键导出DXF功能 新增平面图正射影像一键导出功能 支持交叉、垂直绘制 支…

添加west扩展命令

使用west工具的帮助命令,west -h,不仅可以列出west工具的内置命令,也可以列举当前工程中实现的扩展命令,如build,flash等。 本文将介绍如何添加扩展命令。 west扩展命令的位置通过以下方式查找: 1. 首先找…

kafka消息积压处理方案

背景: 某值班的一天,生产出现消息积压问题,对此类的问题做出快速应对方案来避免同类型问题,防止影响范围进一步的扩大。 出现消费积压后如何处理: 首先优先处理消息积压,如果代码逻辑问题,立…

【第12章】SpringBoot实战篇之文件上传(含阿里云OSS上传)

文章目录 前言一、本地文件上传二、阿里云OSS上传1. 环境准备2.安装SDK3.使用长期访问凭证3.1 获取RAM用户的访问密钥3.2 配置RAM用户的访问密钥(Linux)3.3 从环境变量中获取RAM用户的访问密钥 4. 工具类5.使用 总结 前言 本章节介绍本地文件上传和阿里云OSS上传。 一、本地文…

Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战

Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战 目录 Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战 一、简单介绍 二、轮船人员获救预测实战 三、数据处理 1、导入数据 2、对缺失数据的列进行填充 3、属性转换,把某些列的字符串值…

LSTM-Adaboost基于双向长短期记忆网络结合集成学习实现股价预测附matlab代码

% 股价预测 - LSTM-Adaboost集成学习 % 加载股价数据 load(‘stock_data.mat’); % 假设数据已经存储在stock_data.mat文件中 prices stock_data.prices; % 假设股价数据存储在名为prices的变量中 % 数据预处理 normalized_prices (prices - mean(prices)) / std(prices); …

数组中寻找符合条件元素的位置(np.argwhere,nonzero)

今天遇到一个问题,就是寻找符合条件的元素所在的位置,主要使用np.argwhere和nonzero函数 比如给我一个二维数组,我想知道其中元素大于15的位置 方法1 import numpy as np exnp.arange(30) enp.reshape(ex,[3,10]) print(e) print(e>15…

南山代理记账,为您提供专业、高效的服务和全方位的支持

随着商业活动的不断深化和扩展,企业的会计工作越来越重要,而作为一家专业的代理记账公司,“南山代理记账”始终致力于为客户提供专业、高效的服务,帮助他们在经营过程中更好地管理和运用资金。 南山代理记账公司的服务范围广泛&am…