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

news2024/12/22 20:05:57

在这里插入图片描述

五、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.coloradmin.cn/o/1869008.html

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

相关文章

nodejs国内源下载

nodejs的官网下载太慢了 可以尝试网盘下载快一点 夸克网盘分享夸克网盘是夸克推出的一款云服务产品&#xff0c;功能包括云存储、高清看剧、文件在线解压、PDF一键转换等。通过夸克网盘可随时随地管理和使用照片、文档、手机资料&#xff0c;目前支持Android、iOS、PC、iPad。…

2024年公司加密软件排行榜(企业加密软件推荐)

在信息时代&#xff0c;企业数据安全至关重要&#xff0c;防止数据泄露和未授权访问是首要任务之一。以下是2024年备受好评的企业加密软件排行榜&#xff1a; 固信加密软件https://www.gooxion.com/ 1.固信加密软件 固信加密软件是新一代企业级加密解决方案&#xff0c;采用先…

【网络架构】lvs集群

目录 一、集群与分布式 1.1 集群介绍 1.2 分布式系统 1.3 集群设计原则 二、LVS 2.1 lvs工作原理 2.2 lvs集群体系架构 ​编辑 2.3 lvs功能及组织架构 2.4 lvs集群类型中术语 三、LVS工作模式和命令 3.1 lvs集群的工作模式 3.1.1 lvs的nat模式 3.1.2 lvs的dr模式 …

胶质瘤的发病原因及诊断方式有哪些?

胶质瘤&#xff0c;这个听起来有些陌生的名词&#xff0c;实际上是一种起源于神经胶质细胞的常见脑肿瘤。它的发病原因复杂&#xff0c;涉及遗传、环境、年龄及感染等多种因素。 首先&#xff0c;遗传因素在胶质瘤的发病中占据一席之地。某些遗传性疾病&#xff0c;如结节性硬化…

3Dmax模型渲染时的常见问题与解决方法

3Dmax是一个广为人知的三维建模工具&#xff0c;它在建筑、电影制作和游戏开发等多个领域都有着广泛的应用。尽管如此&#xff0c;在进行3Dmax模型渲染的过程中&#xff0c;用户可能会遇到一些常见问题。本文将提供这些常见问题的解决方案&#xff0c;以帮助用户提高渲染效率和…

BIO、NIO编程深入理解与直接内存、零拷贝

网路编程基本常识 一. Socket 什么是Socket Socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。它提供了应用层进程利用网络协议交换数据的机制&#xff0c;是应用程序与网络协议栈进行交互的接口。 说白了&#xff0c;Socket就是把TCP/IP协议族进行封装…

JOSEF约瑟 ESRW-322打滑开关 智能运算,工作稳定

产品特点 非接触式检测&#xff1a;ESRW-322打滑开关采用非接触式检测方式&#xff0c;不会对输送带造成磨损&#xff0c;提高了设备的使用寿命。 高精度测量&#xff1a;该开关具有高精度测量能力&#xff0c;可检测到的打滑率范围广泛&#xff08;0∽100%&#xff09;&#x…

LangCell:用于细胞注释的语言-细胞预训练模型

细胞身份包括细胞的各种语义&#xff0c;包括细胞类型、pathway信息、疾病信息等。从转录组数据中了解细胞身份&#xff0c;例如注释细胞类型&#xff0c;是一项基础任务。由于语义是由人类赋予的&#xff0c;如果没有cell-label pair提供监督信号&#xff0c;AI模型很难有效地…

文献解读-基因编辑-第十二期|《CRISPR-detector:快速、准确地检测、可视化和注释基因组编辑事件引起的全基因组范围突变》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;基因编辑&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;CRISPR-detector: fast and accurate detection, visualization, and annotation of genome-wide mutations induced by g…

IDEA 安装与激活详细教程最新(附最新激活码)2099年亲测有效!

我们先从 IDEA 官网下载 IDEA 2024.1 版本的安装包&#xff0c;下载链接如下&#xff1a; https://www.jetbrains.com/idea/download/ 点击下载(下载Ultimate版)&#xff0c;静心等待其下载完毕即可。 激活方式&#xff1a; 正版专属激活码领取

自定义APT插件导致IDEA调试时StreamTrace(跟踪当前流链)报internal error(内部错误)

IDEA里面debug的时候&#xff0c;针对stream流提供了流追踪调试功能&#xff0c;方便大家调试stream流代码。 最近改其他人代码&#xff0c;需要用到这个&#xff0c;发现提示内部错误。 然后百度一圈发现没啥解决方案&#xff0c;就自己看IDEA的日志&#xff0c;看看是什么引…

css控制整个div下的所有元素中的文字放大缩小

css控制文字放大缩小 话不多说,直接上代码,我用了最简单粗暴的方法,找个下面所有的元素,然后遍历放大所有文字 add() {var div this.$refs[myDiv];var elements div.querySelectorAll("*");for (var i 0; i < elements.length; i) {var fontSize parseInt(win…

FineReport填报列权限控制

近期换东家啦&#xff0c;又回归使用帆软啦&#xff0c;对于填报报表列权限的控制我这边顺带记录一下 首先讲解下场景&#xff1a;填报报表需要不同角色决定对不同列是否有填写或者查看权限 以填写权限为例&#xff0c;首先考虑用到的是 帆软自带的权限编辑&#xff0c;其次考虑…

如何不改变 PostgreSQL 列类型#PG培训

开发应用程序并在其背后操作数据库集群时&#xff0c;会遇到一个意想不到的问题是实践与理论、开发环境与生产之间的差异。这种不匹配的一个完美例子就是更改列类型。 #PG考试#postgresql培训#postgresql考试#postgresql认证 关于如何在 PostgreSQL&#xff08;以及其他符合 SQ…

使用API有效率地管理Dynadot域名,为文件夹中的域名设置域名转发

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

鸿蒙开发系统基础能力:【@ohos.wallpaper (壁纸)】

壁纸 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import wallpaper from ohos.wallpaper;WallpaperType 定义壁纸类型。 系统能力: 以下各项对应的系统能力均为SystemCapability…

悬浮翻译工具有哪些?来看看这几款悬浮翻译工具吧

沉浸式观影时&#xff0c;却被那些叽里呱啦的外文台词搞得头大如斗&#xff1f; 别焦虑&#xff0c;就算没有现成的字幕&#xff0c;我们也能自己生成&#xff01;如何做到&#xff1f;交给悬浮翻译器&#xff0c;这些软件能实时捕获那些耳边飘过的异国语言&#xff0c;巧妙地…

#### 广告投放 ####

以巨量引擎为例&#xff1a; 计费模式 eCPM&#xff08;expected Cost Per Mile&#xff0c;估计千次展示收入&#xff09; 概括&#xff1a; ecpm为千次展示的预估收益&#xff0c;是广告平台用来给广告排序的指标。 注意是展示而不是千次点击收益&#xff0c;展示了可能不…

WPF 模仿迅雷客户端界面开发

官方&#xff1a; 模仿&#xff1a; 代码粗糙&#xff0c;用于学习WPF界面&#xff0c;尽量满足官方样式与动画&#xff0c;涉及到一些自定义控件&#xff0c;后续持续完善。 演示视频后期完善后补充。 gitee:ThunderboltInterface: 迅雷界面模仿

软件开发不用代码签名证书行吗?

一、代码签名是什么&#xff1f; SSL证书和代码签名证书虽然都属于数字证书的范畴&#xff0c;但它们各自服务于不同的目的和应用场景。 1、SSL证书 SSL证书主要用于保障Web通信的安全&#xff0c;确保客户端&#xff08;通常是浏览器&#xff09;与服务器之间的数据传输加密…