pyhton学习与数据挖掘self原理及应用分析
作者:Python学习与数据挖掘 发布时间:2023-07-04 23:19:11
对,你没看错,这是我初学 python 时的灵魂发问。
我们总会在class里面看见self,但是感觉他好像也没什么用处,就是放在那里占个位子。
如果你也有同样的疑问,那么恭喜你,你的class没学明白。
所以,在解释self是谁之前,我们先明确几个问题:
什么是class,什么是instance?
什么是object? 什么是method,什么是function?
一个画外音,我个人是比较反对在编程中,对本来是英文的专有名词进行中文翻译的。正所谓语言塑造了思维,因此一些专有名词一旦翻译过来,无论你翻译的多好,总会有一定程度的语意模糊。比如说“class”,我们在看到这个词的瞬间会联想到“课”,但是翻译过来就是“类”,于是我们会不自觉地,去按照“课”或者“一大类”去理解这个专有名词。这是一种非常严重的潜在的误导,因为class这个专有名词和“课”或者“一大类”关系都不太大。所以还不如不翻译,就当不知道这个词啥意思,在学习的过程中再慢慢理解他代表的意思。
其实因为英文的局限性,很多编程语言里的专属名词也是大佬们一拍脑袋,瞎起的。。比如我吐槽了无数次的matplotlib里面的axes。。。
又说多了。。。回到正题。
1. 什么是class,什么是instance,什么是object?
Class: 可以理解为一个组装工厂。假如我们要生产一个机器人,那我们先要搭个工厂吧。先确定:我们要先安装胳膊,再安装头,我们的小破机器人的流水线就搭好了。这个工厂比较智能,胳膊和头的数量都可以调。
class BuildRobot():
def __init__(self,armcount,headcount):
self.armcount = armcount
self.headcount = headcount
所以这里的class,就是搭了一个工厂叫BuildRobot。'__init__' 就是告诉这个流水线,首先你需要这个机器人有几个胳膊(‘armcount'),有几个脑袋(‘headcount')。先忽略一下这里的self,以后讲。
这个时候你可以run一下,这样你的class就搭好了。可是这时的工厂,因为你没有开始生产,是没有任何产出的。下面就是instance
instance:可以理解为启动一次工厂生产出的机器人。现在我们用之前搭的工厂生产一个正常一点的机器人,两个胳膊一个脑袋:
normal_robot = BuildRobot(2,1)
查看一下胳膊数对不对?
我们再来一个 不太正常的机器人:
weird_robot = BuildRobot(4,1)
normal_robot 和weird_robot 都是instance。他们虽然胳膊数量不一样,但是本质上都是由这个class造出来的,由胳膊和头组成的机器人。
object: 这个就比较麻烦了,大部分情况下,object和instance的含义是一样的,都是指这个造出来的robot。这两者的区别,只是在英语语言环境下的区别:
normal_robot is an instance of ‘buildrobot'
normal_robot is a ‘buildrobot' object
上面这两个说法是等价的。
2. 什么是method,什么是function?
两者都由def定义,稍微粗糙一点的理解就是,在class里面的function叫method。所以,method是和class,instance有关的一种function。
举个栗子:
还是上面的工厂,我们现在加装一个车间,负责把胳膊上色:
class BuildRobot():
def __init__(self,armcount,headcount):
self.armcount = armcount
self.headcount = headcount
def paintarm(self,color):
print("paint arm:",color)
这个paintarm,就是一个method。还是一样,现在这个class没有生产,因此这个method也没有任何实际的产品出来。我们只能先生产出一个instance来:
colorful_robot = BuildRobot(2,1)
好的我们现在有一个两个胳膊一个头的robot了。这时,我们的robot还是没有上色的,因为我们没有让这个instance进入上色的那个车间。现在我们让这个robot进入车间,涂个红色。
colorful_robot.paintarm('red')
paint arm: red
上面的过程,就是call这个paintarm method。几个点:
如果没有先造一个机器人,这个车间就没有办法给胳膊上色,因此要上色,就必须先造一个机器人出来。所以,method是依赖于instance的。
这个车间只能给这个工厂产出的robot的胳膊上色,你从别的工厂拿一个车过来让他上色,他是不干的。因此,method是依赖于class的。只有这个class创建的instance,才能call这个method。
假如我把上色这个活,外包了。我就在外面另建了个工厂,专门上色,这就是function:
def outsourcing_paint(robot,color):
print("paint",robot,"arm:",color)
outsourcing_paint(colorful_robot,'red')
paint <__main__.BuildRobot object at 0x116b434a8> arm: red
这个外包的上色工厂,不管你这个东西是从哪个工厂来的,无论你是个机器人还是机器狗,反正我就拿来,给胳膊上色。
看到这里,应该就明白function和method的区别了。
注意method其实有两种,一种是instance method,一种是class method。
instance method就相当于对于机器人这个产品进行各种修改的车间。我给机器人上色,不影响我这个工厂的外形对吧?
class method,是对这个工厂,这个class的属性进行修改的车间,比如我有一个车间负责把工厂涂成红色的。这个行为并不影响我造出来的机器人的大小颜色属性。
本篇的讨论,我们先限定在instance method里。
3. 重点SELF分析
把class, method讲明白以后,终于能讲self了。通过上面的例子,我们注意到
outsourcing_paint(colorful_robot,'red')
在function里面,是没有self的。因为我们告诉了外包工厂,给谁上色。所以在定义外包工厂function时,我们有两个input variables:robot 和 color。
colorful_robot.paintarm('red')
然鹅在使用method的时候,我们只告诉了车间,我要红色。那这个车间怎么知道,给哪个机器人上色啊?是给normal robot还是给colorful robot?因为我们在call这个method的时候,使用了colorful_robot.paintarm()这个格式,于是paintarm这个method就知道,哦,我要给这个colorful_robot上色。
在python里,要想使instance.method()这个格式可以正常工作,在class里面编写method的时候,就必须把变量的第一个位子留出来,用来指代未来call这个method的instance。就相当于我们在搭建给胳膊上色的这个车间的时候,就必须预留一个入口来放入已经生产出来的机器人。
留出来的这个位子,可以叫任何名字。只不过为了代码的优美,大部分人选择使用self,来指代使用这个method的instance他自己。
来源:https://blog.csdn.net/weixin_38037405/article/details/120377125


猜你喜欢
- 本文实例讲述了python实现集中式的病毒扫描功能。分享给大家供大家参考,具体如下:一 点睛本次实践实现了一个集中式的病毒扫描管理
- 1、什么是数据库连接池就是一个容器持有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理。2
- GO 语言的 for…range 能做什么呢?for…range 如何使用 ?for…range 的返回
- 前言:python 有自己的多进包 multiprocessing 去实现并行计算,但在Pandas处理数据中,使用 multiproces
- 大家都出书,我也很幸运的有了这本书,不过一本书的好与坏,错与对都是在于一个人的理解,web标准这个东西主要还是大家理解,理解的深
- import pdbdef pdb_test(arg): for i in range(arg):&nb
- python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包。一、numpy的导入和使用from&nb
- 对于一个网站的图片、文字音视频等,如果我们一个个的下载,不仅浪费时间,而且很容易出错。Python爬虫帮助我们获取需要的数据,这个数据是可以
- 还是一样,先上代码: <script> var f = function g() { return 1; }; if (fals
- 语句格式:numpy.zeros(shape, dtype=float, order='C')参数说明:shape:整型或元
- MySQL服务器有几个影响其操作的参数(变量)。如果缺省的参数值不合适,可以将其修改为对服务器运行环境更合适的值。例如,如果您有大量的内存,
- 最近在重新看vue3的rfcs,发现一个细节,原话如下:props that start with on are handled as v-
- 我有一个2D(二维) NumPy数组,并希望用255.0替换大于或等于阈值T的所有值。据我所知,最基础的方法是:shape = arr.sh
- 导言篇:我的python环境是:python3.6.5这里我选择的GUI编程包是:tkintertkinker在python2.5以后就是自
- 本文实例讲述了Python使用matplotlib 画矩形的三种方式。分享给大家供大家参考,具体如下:假设矩形两点坐标如下,分别为:x1,
- 视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉。但是在实际应用中,并
- 开发背景:每次项目都要写数据库、烦死了。。然后就每次数据库都要花很多时间。烦死了!不如写个通用的增删查改,以不变应万变!特性:搭建通用增删查
- 本文总结了YiiFramework入门知识点。分享给大家供大家参考,具体如下:创建Yii应用骨架web为网站根目录yiic webapp /
- 下面直接记录下配置主从库的操作:(本文用的是mysql5.0以上)1.在主库建立要同步的数据库,建立主库的帐号和修改主库配置首先连接上数据库
- 本篇文章将实现用Python获取系统信息CPU占有率并将其变化绘制成折线图。第一步:获取系统CPU占有率信息psutil模块是专门获取系统信