你需要理解的Python核心概念-对象
off999 2024-11-15 23:09 29 浏览 0 评论
对象是 Python 语言的构建块
Python 很容易学习。然而,它有一些更难理解的方面,比如类和对象的世界。在本文中,你将学到:
- 在 Python 中一切都是对象
- 如何创建自己的类和对象
- 什么是继承以及如何利用它来发挥自己的优势
通过揭开 Python 对象的神秘面纱,你对该语言的理解将大大增加!
对象
对象在 Python 中起着核心作用。让我们深入了解一下,以增加你对对象的理解。
你可能知道内置len函数。它返回你给它的对象的长度。但是,比如说,数字5 的长度是多少?让我们运行一下代码看看。
print(len(5))我喜欢错误,因为它们说明了 Python 内部是如何工作的。在这种情况下,Python 告诉我们 5 是一个对象,它没有len().
在 Python 中,一切都是对象。字符串、布尔值、数字,甚至函数都是对象。
我们可以使用内置函数检查 REPL 中的对象dir()。当我们尝试dir使用数字 5 时,它会显示一个很大的函数列表,这些函数是任何数字对象的一部分
dir(5)该列表以这些包含下划线的奇怪命名函数开头,例如__add__. 这些被称为魔术方法,或 dunder(双下划线的缩写)方法。
如果你仔细观察,你会发现类型对象没有__len__dunder 方法int。这就是 Python 的len()函数如何知道数字没有长度的方式。len()所做的就是调用你提供的对象上的方法__len__()。这也是 Python 抱怨 'int' 类型的对象没有len().
我在这里随便介绍了方法这个词。让我更正式地定义它:
当函数是对象的一部分时,我们称其为方法。
所以如果一个字符串确实有长度,它一定有一个__len__方法,对吧?让我们来了解一下!
dir("test")可以看到字符串有__len__()这个方法。由于这是一个方法,我们也可以调用它:
"test".__len__()
# 4这相当于len("test"),但不那么优雅。所以不要这样做,这只是为了说明这些东西是如何工作的。
还有一系列其他不那么神奇的方法dir()向我们揭示了。随意尝试一些,例如
"test".islower()
# true此方法检查整个字符串是否为小写,因此 Python 返回 boolean True。其中一些方法需要一个或多个参数,例如replace:
"abcd".replace('a','b') # 它将所有出现的“a”替换为“b”。
# 'bbcd'什么是对象
现在我们已经使用了对象并且知道 Python 中的一切都是对象,是时候定义对象是什么了:
对象是数据(变量)和对该数据进行操作的方法的集合
对象和面向对象编程是 1990 年代初流行的概念。早期的计算机语言,如 C,没有对象的概念。然而,事实证明,对象对于人类来说是一种易于理解的范式——它可以用来模拟许多现实生活中的情况。
如今,大多数(如果不是全部)新语言都有对象的概念。因此,你将要学习的内容在概念上也适用于其他语言。
由于对象是 Python 语言的构建块,因此你也可以自己创建对象是合乎逻辑的。为此,我们需要先定义一个类。
class
如果要创建自己的对象类型,首先需要定义它具有哪些方法以及它可以保存哪些数据。这个蓝图被称为一个类
类是对象的蓝图
所有对象都基于一个类。当我们创建一个对象时,我们称之为“创建一个类的实例”。字符串、数字甚至布尔值也是类的实例。让我们用内置函数来探索type:
>>> type('a')
<class 'str'>
>>> type(1)
<class 'int'>
type(True)
<class 'bool'>显然我们看到一些有名为str、int和的类bool。这些是 Python 的一些原生类,但我们也可以构建自己的类!
让我们创建一个代表汽车的类。
class Car:
speed = 0
started = False
def start(self):
self.started = True
print("Car started, let's ride!")
def increase_speed(self, delta):
if self.started:
self.speed = self. speed + delta
print('Vrooooom!')
else:
print("你需要先启动汽车")
def stop(self):
self.speed = 0
print('Halting')让我们首先创建并使用一个 Car 类型的对象
car = Car()
car.increase_speed(10)
car.start()
car.increase_speed(40)对象始终是类的实例。一个类可以有多个实例。我们刚刚创建了一个 Car 类的实例,使用Car(),并将其分配给变量car。创建一个实例看起来就像调用一个函数——你稍后会知道为什么。
接下来,我们在汽车对象上调用其中一种方法:尝试在它还没有启动的时候提高它的速度。哎呀!只有启动汽车后,我们才能提高它的速度并享受它发出的噪音。
现在让我们逐步回顾一下我们的 Car 类:
- 使用class后跟类名 (Car) 的语句定义类。我们用冒号开始一个缩进的代码块。
- 我们定义了两个变量,speed和started。这是该类的所有实例都将拥有的数据。
- 接下来,我们定义了三个对变量进行操作的方法。
在这些方法的定义中,我们遇到了一些特殊的情况:它们都有一个参数,称为self它们的第一个参数。
什么是self?
老实说,如果你问我,这是 Python 不太优雅的语言结构之一。
还记得我们在汽车对象上调用方法的时候car.start()吗?我们不必传递self变量,即使在类内部start定义start(self)。
这就是正在发生的事情:
- 当我们在对象上调用方法时,Python 会自动填充第一个变量,我们self按照约定调用
- 第一个变量是对对象本身的引用,因此它的名字
- 我们可以使用这个变量来引用这个对象的其他实例变量和函数,比如self.speed和self.start()。
因此,仅在类定义中,我们使用 self 来引用属于实例一部分的变量。要修改started属于我们类的变量,我们使用self.started而不仅仅是started.
通过使用self,可以清楚地表明我们正在对作为此实例一部分的变量进行操作,而不是在对象外部定义并且恰好具有相同名称的其他变量。
从一个类创建多个对象
由于一个类只是一个蓝图,你可以使用它来创建多个对象,就像你可以构建多个外观相同的汽车一样。它们的行为都相似,但它们都有自己的数据,而不是在对象之间共享:
>>> car1 = Car()
>>> car2 = Car()
>>> id(car1)
139771129539104
>>> id(car2)
139771129539160我们在这里创建了两个汽车对象,car1 和 car2,并使用内置方法id()获取它们的 id。Python 中的每个对象都有一个唯一的标识符,所以我们只是证明了我们从同一个类中创建了两个不同的对象。我们可以独立使用它们:
>>> car1.start()
车子启动了,我们骑吧!
>>> car1.increase_speed(10)
'Vrooom!'
>>> car1.speed
10
>>> car2.speed
0我们刚刚开始car1并增加了它的速度,而car2的速度没有发生改变,这就是不同的实例具有不同的状态。
构造函数
当从一个类创建一个对象时,看起来我们正在调用一个函数:
car = car()但它看起来不仅仅是我们在调用一个函数,我们实际上是在调用一个函数!这个我们不必定义的方法称为构造函数。它构造并初始化对象。每个类默认都有一个,称为__init__,即使我们自己没有定义它。这与继承有关,稍后我将说明这一点。
你是否曾经使用该str()函数将对象转换为类?或者可能是 int() 函数将字符串转换为数字?
>>> 'a' + str(1)
'a1'
>>> int('2') + 2
4实际上在这里所做的是创建新的类型对象str并int通过调用类的构造函数str和int.
我们也可以重写该__init__方法,通过接受参数来赋予它额外的能力。让我们使用自定义构造函数重新定义 Car 类:
class Car:
def __init__(self, started = False, speed = 0):
self.started = started
self.speed = speed
def start(self):
self.started = True
print("Car started, let's ride!")
def increase_speed(self, delta):
if self.started:
self.speed = self.speed + delta
print("Vrooooom!")
else:
print("你需要先启动汽车")
def stop(self):
self.speed = 0我们的自定义构造函数使用默认值命名参数,因此我们可以通过多种方式创建 Car 类的实例:
>>> c1 = Car()
>>> c2 = Car(True)
>>> c3 = Car(True, 50)
>>> c4 = Car(started=True, speed=40)继承
在编程中,尽可能多地重用代码被认为是一种很好的风格。这种做法甚至有一个很好的首字母缩写词,称为 DRY:不要重复自己。
类可以帮助你避免重复代码,因为你可以编写一个类并基于它创建许多对象。但是,它们还以另一种方式为你提供帮助,称为继承。类可以从其他类继承属性和函数,因此你不必重复自己。
例如,我们希望我们的 Car 类从 Vehicle 类继承一些基础知识。而且,当我们这样做的时候,还要定义一个 Motorcycle 类。从示意图上看,它看起来像这样:
我们已经看到了继承的作用。还记得我告诉过你每个类都有一个构造函数(__init__),即使你没有定义一个?这是因为每个类都继承自 Python 中最基本的类,称为object:
dir(object)
当我告诉你“Python 中的一切都是对象”时,我的意思是一切。这包括类,如你所见,我们也可以dir()在类上使用。它表明object有一个__init__方法。
继承映射到许多现实生活中的情况。让我们根据上图来看看实际的继承。我们将从一个泛型Vehicle类开始:
class Vehicle:
def __init__(self, started = False, speed = 0):
self.started = started
self.speed = speed
def start(self):
self.started = True
print("Started, let's ride!")
def stop(self):
self.speed = 0
def increase_speed(self, delta):
if self.started:
self.speed = self.speed + delta
print("Vrooooom!")
else:
print("You need to start me first")现在我们可以Car使用继承重新定义我们的类
class Car(Vehicle):
trunk_open = False
def open_trunk(self):
trunk_open = True
def close_trunk(self):
trunk_open = False我们的汽车从类中继承了所有的方法和变量Vehicle,但是增加了一个额外的变量和两个方法。
重写init方法
有时你想覆盖 init 函数。为了演示,我们可以创建一个 Motorcycle 类。大多数摩托车都有一个中心支架。我们将添加在初始化时将其输出或输入的功能:
class Motorcycle(Vehicle):
def __init__(self, center_stand_out = False):
self.center_stand_out = center_stand_out
super().__init__()当你覆盖构造函数时,根本不会调用来自父类(我们继承的)的构造函数。如果你仍然需要该功能,则必须自己调用它。这是通过super():它返回对父类的引用,因此我们可以调用父类的构造函数。
在这种情况下,我们为中心支架添加了功能,但删除了在构造函数中设置速度和启动状态的选项。如果需要,你也可以添加速度和启动状态选项,并将它们传递给Vehicle构造函数。
覆盖其他方法
就像__init__,我们也可以覆盖其他方法。例如,如果你想实现一个不启动的摩托车,你可以重写 start 方法:
class Motorcycle(Vehicle):
def __init__(self, center_stand_out = False):
self.center_stand_out = center_stand_out
super().__init__()
def start(self):
print("Sorry, out of fuel!")感谢你的阅读。如果你想了解有关 Python 的更多信息,请关注我。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
