生命在于学习——Python人工智能原理(2.5.1)

在这里插入图片描述

五、Python的类与继承

5.1 Python面向对象编程

在现实世界中存在各种不同形态的事物,这些事物之间存在各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象之间的关系描述事物之间的联系,这种思想用在编程中就是面向对象编程。

(1)面向对象编程的含义

面向对象编程,简称oop,是一种编程范例。它提供了一种结构化程序的方法,以便将属性和行为捆绑到单个对象中。

(2)类与对象定义

对象是一个抽象概念,将对象划分为两个部分,即静态部分和动态部分,静态部分被称为属性,任何对象都具备自身属性,这些不仅是客观存在的,而且是不能忽视的。
类是封装对象的属性和行为的载体,对象是类的示例。

(3)面向对象的特征

面向对象程序设计有三大基本特征:封装、继承、多态。
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类。

(4)面向对象与面向过程编程的区别

面向过程思想在早期开发语言中大量使用,它是分析出解决问题的步骤,然后用函数将这些步骤一一实现,使用的时候另行调用,面向过程只考虑在函数中封装代码逻辑,不考虑函数的归属关系。

(5)类的定义与使用

a、定义
在Python中,类表示具有相同属性和方法的对象集合,在使用类时,需要先定义类,然后再创建类的实例,类的定义使用class关键字实现,默认有init方法。

class dog:
	def _init_(self,name,age):
		self.name = name
		self.age = age
	def bark(self):
		print("woof!")
#创建类的实例
my_dog = Dog(name="Buddy",age=3)
#访问对象的属性
print(my_dog.name)#输出:buddy
#调用对象的方法
my_dog.bark()#输出:woof!

b、使用
通过实例化类来创建对象,并通过对象访问属性和调用方法,在上面的例子中,Dog类定义了一个狗的对象,具有name和age两个属性以及bark方法,通过创建my_dog对象,我们可以访问其属性和调用其方法。

5.2 属性和方法的定义和使用

(1)创建类与对象

a、属性

属性用于描述事物的特征,如颜色、大小、数量等。可以分为类属性和对象属性。类的属性存储了类的各种数据,定义位置有类的内部和方法的外部,由该类所有的对象共同拥有。类属性可以通过类名访问,也可以通过对象名访问,但只能通过类名修改。

class Dog:
	count = 0

	def _init_(self,name,age)
		self.name = name
		self.age = age
		Dog.count += 1 #在初始化时增加count的值
	def bark(self):
		print("Woof!")
	在类中,属性是对象的特征或数据,属性通常在构造方法中初始化,并通过self关键字来引用。
b、python的内置类属性
  1. dict : 类的属性(包含一个字典,由类的数据属性组成)
  2. doc :类的文档字符串
  3. name: 类名
  4. module: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module
    等于 mymod)
  5. bases : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
c、对象属性

对象属性是对象特征的描述,定义非常灵活,可在方法内部定义,也可在调用实例时添加如scf.name和self.age都是对象属性。私有属性也是一种对象属性。

d、私有属性

在实例变量self前加单个下划线,以保护变量,变量并不是真正的受保护,这只是Python开发者的约定,在看到单个前置下划线的变量时,并不会尝试访问和修改它,双前置下划线会让Python解释器重写属性的名称,以达到保护变量的目的。

e、构造函数

介绍:

构造函数(也称为初始化方法)是一个特殊的方法,当创建类的新实例时会自动调用。在Python中,构造函数的名称是__init__。

代码示例:

class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
p = Person("Alice", 30)  
print(p.name)  # 输出: Alice  
print(p.age)   # 输出: 30
f、析构函数

介绍:

析构函数在对象被销毁前(例如,对象被垃圾回收)调用,用于执行清理操作,如关闭文件或释放资源。在Python中,没有显式的析构函数,但可以使用__del__方法作为析构函数的类似物。然而,由于Python的垃圾回收机制,__del__方法并不总是会被调用。

代码示例(虽然不推荐依赖__del__进行资源清理):

class MyClass:  
    def __del__(self):  
        print("对象被销毁")  
  
# 创建一个对象,但在大多数情况下,我们不会看到"对象被销毁"的输出  
obj = MyClass()
g、对象方法

介绍:

对象方法是类的实例可以调用的方法。它们通常用于操作实例的状态。

代码示例:

class Circle:  
    def __init__(self, radius):  
        self.radius = radius  
  
    def area(self):  
        return 3.14 * self.radius ** 2  
  
circle = Circle(5)  
print(circle.area())  # 输出圆的面积
h、私有方法

介绍:

Python没有真正的私有方法或属性,但有一种约定俗成的做法是使用双下划线前缀来表示“私有”成员。然而,这只是一个命名约定,Python仍然可以从外部访问这些成员。真正的“私有”性是通过其他机制(如属性装饰器)实现的。

代码示例:

class MyClass:  
    def __private_method(self):  
        print("这是一个'私有'方法")  
  
    def public_method(self):  
        self.__private_method()  # 类的内部可以调用它  
  
# 但仍然可以从外部“访问”它(尽管不推荐)  
obj = MyClass()  
obj._MyClass__private_method()  # 注意这里的命名转换
i、Python内置类方法

Python的内置方法(也称为魔法方法或双下划线方法)确实非常多,它们提供了丰富的功能和定制性。这里是一些常用的内置方法的补充,以及它们的简要说明和示例:

1. 初始化与销毁
__init__(self, ...): 构造函数,初始化对象时调用。
__del__(self): 析构函数,对象被销毁前调用(但通常不推荐在__del__中执行重要清理工作)。
2. 字符串与表示
__str__(self): 返回对象的“非正式”字符串表示。
__repr__(self): 返回对象的“正式”字符串表示,供调试使用。
3. 数值运算
__add__(self, other): 实现+运算符。
__sub__(self, other): 实现-运算符。
__mul__(self, other): 实现*运算符。
__truediv__(self, other): 实现/运算符(Python 3中的真实除法)。
__floordiv__(self, other): 实现//运算符(整数除法)。
__mod__(self, other): 实现%运算符(取模)。
__pow__(self, other): 实现**运算符(幂运算)。
4. 序列操作
__len__(self): 返回对象的长度或元素个数。
__getitem__(self, index): 实现item[index]。
__setitem__(self, index, value): 实现item[index] = value。
__delitem__(self, index): 实现del item[index]。
__contains__(self, item): 实现in运算符。
5. 比较运算
__lt__(self, other): 实现<运算符。
__le__(self, other): 实现<=运算符。
__eq__(self, other): 实现==运算符。
__ne__(self, other): 实现!=运算符。
__gt__(self, other): 实现>运算符。
__ge__(self, other): 实现>=运算符。
6. 集合操作
__hash__(self): 返回对象的哈希值(如果对象是可哈希的)。
__iter__(self): 返回一个迭代器对象。
__next__(self): 迭代器对象的next()方法。
__getattribute__(self, name): 访问对象属性时调用。
__setattr__(self, name, value): 设置对象属性时调用。
__delattr__(self, name): 删除对象属性时调用。
7. 上下文管理
__enter__(self): 使用with语句时进入上下文时调用。
__exit__(self, exc_type, exc_val, exc_tb): 使用with语句时退出上下文时调用。
8. 容器操作
__contains__(self, item): 实现in运算符,判断容器中是否包含某个元素。
__iter__(self): 返回一个迭代器对象,用于遍历容器中的元素。
示例:自定义一个可迭代对象
python
class MyRange:  
    def __init__(self, start, end):  
        self.value = start  
        self.end = end  
  
    def __iter__(self):  
        return self  
  
    def __next__(self):  
        if self.value < self.end:  
            current_value = self.value  
            self.value += 1  
            return current_value  
        else:  
            raise StopIteration  
  
# 使用自定义的MyRange类  
for i in MyRange(0, 5):  
    print(i)  # 输出: 0 1 2 3 4

5.3 类的继承

继承是面向对象编程的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以继承父类的特征,也可以通过定义自己的属性和方法来扩展或修改父类的行为。一个类继承另一个类时,它将自动获得另一个类的属性和方法,原有的类称为父类。
新类称为子类,子类不能继承父类的私有属性和方法,但能继承父类其他的属性和方法,同时还可以定义自己的属性和方法,子类定义格式如下:

class 子类名(父类名)

(1)子类的方法_init_

如果子类重新定义了父类方法后,还需要访问父类的同名方法,如__init__,可以使用super关键字。

(2)给子类定义属性和方法

一个类继承另一个类后,可添加区分子类里父类所需的新属性和方法。
定义子类时,可以根据需要添加任意数量的属性和方法,但要注意子类中只添加子类独有的属性和方法,如果是所有子类都拥有的,应该添加到父类的属性和方法中。

(3)重写父类方法

对于父类中的方法,如果它不符合子类模拟的实物的行为,都可对其进行重写,为此,可在子类中定义与父类同名的方法,这样,python程序在运行时将不会考虑这个父方法,而只考虑同名的子类方法。

(4)将实例用作属性

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

5.4 导入类

类的编写也要遵循模块化编程,导入类有多种方式,可以导入单个类,导入多个类,导入整个模块导入模块中的所有类等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】线性表之《队列》超详细实现

队列 一.队列的概念及结构二.顺序队列与链队列1.顺序队列2.链队列 三.链队列的实现1.创建队列2.初始化队列3.入队4.出队5.获取队头元素6.获取队尾元素7.队列的大小8.队列的判空9.清空队列10.销毁队列 四.队列的盲区五.模块化源代码1.Queue.h2.Queue.c3.test.c 六.栈和队列必做O…

解题思路:LeetCode 第 209 题 “Minimum Size Subarray Sum“

解题思路&#xff1a;LeetCode 第 209 题 “Minimum Size Subarray Sum” 在这篇博文中&#xff0c;我们将探讨如何使用 Swift 解决 LeetCode 第 209 题 “Minimum Size Subarray Sum”。我们会讨论两种方法&#xff1a;暴力法和滑动窗口法&#xff0c;并对这两种方法的时间复…

confluence集成LDAP

一、confluence的权限管理 在集成前&#xff0c;我们必须得知道confluence自身的权限管理是如何做的。 用户组对应空间权限&#xff0c;用户组可以是一个项目&#xff0c;也可以是一个部门或组。 一个用户组里的用户&#xff0c;可以读写本空间的页面&#xff0c;而把其他组隔离…

“文本比对基础:最短编辑距离算法的原理与实现“

最短编辑距离 给定两个字符串 &#x1d434; 和 &#x1d435;&#xff0c;现在要将 &#x1d434; 经过若干操作变为 &#x1d435;&#xff0c;可进行的操作有&#xff1a; 删除–将字符串 &#x1d434; 中的某个字符删除。插入–在字符串 &#x1d434; 的某个位置插入某…

有没有将音频转文字的app?盘点5款高效的音频转文字工具

在职场的快节奏生活中&#xff0c;时间就是金钱&#xff0c;效率就是生命。 我们常常在会议中奋笔疾书&#xff0c;却错过了关键的讨论&#xff1b;在电话会议中努力记忆要点&#xff0c;却难以捕捉每一个细节。 但别担心&#xff0c;有一种工具能让我们摆脱这些困扰——音频…

靶机渗透之DC-8

一、信息收集 扫一下子网段&#xff0c;发现靶机ip为192.168.145.130。 nmap -sP 192.168.145.* 进一步进行端口、系统等信息扫描&#xff0c;开放的端口为80、22&#xff0c;中间件为apache。 nmap -sT -T4 -sV -O -sC -p1-65535 192.168.145.130 再扫一下网站目录&#xf…

【方法分享】如何使用WinRAR将文件夹里的每个文件压缩

不知道大家是否会遇到这种情况&#xff0c;将文件夹内的多个文件或文件夹压缩成一个个压缩包文件&#xff0c;这种情况除了将文件夹中的文件一个个压缩&#xff0c;还有什么批量操作的方法呢&#xff1f;今天分享使用WinRAR批量压缩文件到每个单独的文件夹的方法。 方法如下&a…

一键vmp加固apk aar aab

简介 最近工作需要基于vpm加固封装了一套一键加固的方案,可以给apk aar aab文件实现一键加固&#xff0c;把所有的dex内容都封装到so库里面&#xff0c;加大了反编译破解的难度。 环境配置: 需要配置环境变量: ANDROID_NDK_HOME ANDROID_SDK_HOME CMAKE_PATH JAVA_HOME使用方…

高考填报志愿,是选就业前景?还是选自己的兴趣爱好?

一、 当前的就业形式 受yi情影响&#xff0c;全国的就业处于下滑趋势&#xff0c;互联网和实体企业呈现疲软势态&#xff0c;很多企业不得不裁员。大学毕业生人数几乎每年都会上涨&#xff0c;带来的是僧多粥少的就业状态。 考得好不如报得好 就业环境如此严峻的形势下&#…

如何实现数字人系统私有化部署?数字人源码部署教程简易版来了!

当前&#xff0c;数字人行业的市场前景和应用潜力不断显现&#xff0c;不少创业者都想要通过学习数字人源码部署教程来搭建属于自己的数字人系统&#xff0c;以此获得进军数字人行业的入场券。而事实上&#xff0c;该想法本身当然是固然值得鼓励的&#xff0c;但就目前的实践情…

深度学习Week18——学习残差网络和ResNet-50算法

文章目录 深度学习Week18——学习残差网络和ResNet-50算法 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 配置数据集 2.3 数据可视化 2.4 再次检查数据 四、构建ResNet-50网络模型 五、编译模型 六、训练模型 七、模型评估 八、指定图片预测 …

超详细的Stable Diffusion WebUI 安装!

前言 安装方式&#xff1a; 使用发行包在带有 NVidia-GPU 的 Windows 10/11 上安装 sd.webui.zip从v1.0.0-pre下载并解压其内容。 跑步update.bat。 跑步run.bat。 Windows 上自动安装 安装Python 3.10.6&#xff08;较新版本的Python不支持torch&#xff09;&#xff0…

stm32cubemx,adc采样的几种方总结,触发获取adc值的方法dma timer trigger中断

stm32cubemx adc采样的几种方总结&#xff0c;触发获取adc值的方法 timer trigger中断 方法1&#xff0c;软件触发方法2&#xff1a;,Timer触发ADC采集通过DMA搬运 触发获取adc值的方法 Regular Conversion launched by software 软件触发 调用函数即可触发ADC转换 Timer X Cap…

英伟达GB200系列AI芯片供不应求;阿里云通义灵码上线Visual Studio插件市场

&#x1f989; AI新闻 &#x1f680; 英伟达GB200系列AI芯片供不应求 摘要&#xff1a;英伟达GB200系列AI芯片供不应求&#xff0c;台积电和日月光等公司获追加订单。GB200芯片性能提升30倍&#xff0c;成本和能耗降至25分之一。预计2025年出货量突破百万颗&#xff0c;后段封…

收藏 | SSL证书无效的原因和解决办法

当浏览器访问一个使用SSL证书保护的网站时&#xff0c;会检查其证书的有效性。如果发现证书存在问题&#xff0c;浏览器会显示“SSL证书无效”的警告信息&#xff0c;提醒用户存在潜在的安全风险。 “SSL证书无效”的警告可能会导致用户离开站点&#xff08;并且永远不会返回&…

72V转12V非隔离DC/DC电源原理图+PCB源文件

资料下载地址&#xff1a;72V转12V非隔离DCDC电源原理图PCB源文件 电动车所用的非隔离DC/DC电源&#xff0c;采用BUCK电路&#xff0c;运行稳定&#xff0c;为已经在产品中使用的电路 1、原理图 2、PCB

Cryptographic algorithms—(Green-Book)加密算法

Cryptographic algorithms—加密算法 9.2.3 加密算法9.2.3.1 概述9.2.3.2 哈希函数9.2.3.3 对称密钥算法9.2.3.3.1 概述9.2.3.3.2 加密和解密9.2.3.3.3 高级加密标准9.2.3.3.4 加密操作模式9.2.3.3.5 消息认证码9.2.3.3.6 密钥包装9.2.3.3.7 Galois/Counter Mode9.2.3.3.7.1 概…

星星历c++

题目描述 不管是基于太阳的阳历&#xff0c;还是基于月亮的阴历&#xff0c;或者阴阳合历的农历&#xff0c;都太复杂了。 XXX自己发明了一套历法&#xff0c;取名为“星星历”。星星历采用每年 3 星&#xff0c;每星 120 天的方式纪年。 XXX定义现实的 2024 年 1 月 18 日为…

CVPR讲座总结(二)-探索图像生成基础模型的最新进展探索多模态代理的最新进展:从视频理解到可操作代理

引言 在CVPR24上的教程中&#xff0c;微软高级研究员Linjie Li为我们带来了多模态代理的深入探索。这些代理通过整合多模态专家和大语言模型&#xff08;LLM&#xff09;来增强感知、理解和生成能力。本文总结了Linjie Li的讲座内容&#xff0c;重点介绍了多模态记忆、可操作代…

碳课堂|ISO 14064标准新版变化

ISO 14064标准是针对组织碳排放方面的管理标准&#xff0c;包括温室气体排放和清除的量化、报告与验证的国际标准。其最新版本于 2018年发布&#xff0c;标志着对温室气体管理的全球认知和实践的进一步演进。ISO 14064 作为 ISO 14060 标准系列的重要组成部分&#xff0c;将继续…