- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章pyhton学习与数据挖掘self原理及应用分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
对,你没看错,这是我初学 python 时的灵魂发问.
我们总会在class里面看见self,但是感觉他好像也没什么用处,就是放在那里占个位子.
如果你也有同样的疑问,那么恭喜你,你的class没学明白.
所以,在解释self是谁之前,我们先明确几个问题:
一个画外音,我个人是比较反对在编程中,对本来是英文的专有名词进行中文翻译的。正所谓语言塑造了思维,因此一些专有名词一旦翻译过来,无论你翻译的多好,总会有一定程度的语意模糊。比如说“class”,我们在看到这个词的瞬间会联想到“课”,但是翻译过来就是“类”,于是我们会不自觉地,去按照“课”或者“一大类”去理解这个专有名词。这是一种非常严重的潜在的误导,因为class这个专有名词和“课”或者“一大类”关系都不太大。所以还不如不翻译,就当不知道这个词啥意思,在学习的过程中再慢慢理解他代表的意思.
其实因为英文的局限性,很多编程语言里的专属名词也是大佬们一拍脑袋,瞎起的。。比如我吐槽了无数次的matplotlib里面的axes。。.
又说多了。。。回到正题.
Class: 可以理解为一个组装工厂。假如我们要生产一个机器人,那我们先要搭个工厂吧。先确定:我们要先安装胳膊,再安装头,我们的小破机器人的流水线就搭好了。这个工厂比较智能,胳膊和头的数量都可以调.
1
2
3
4
|
class
BuildRobot():
def
__init__(
self
,armcount,headcount):
self
.armcount
=
armcount
self
.headcount
=
headcount
|
所以这里的class,就是搭了一个工厂叫BuildRobot。'__init__' 就是告诉这个流水线,首先你需要这个机器人有几个胳膊(‘armcount'),有几个脑袋(‘headcount')。先忽略一下这里的self,以后讲.
这个时候你可以run一下,这样你的class就搭好了。可是这时的工厂,因为你没有开始生产,是没有任何产出的。下面就是instance 。
instance:可以理解为启动一次工厂生产出的机器人。现在我们用之前搭的工厂生产一个正常一点的机器人,两个胳膊一个脑袋:
1
|
normal_robot
=
BuildRobot(
2
,
1
)
|
查看一下胳膊数对不对?
我们再来一个 不太正常的机器人:
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 。
上面这两个说法是等价的.
两者都由def定义,稍微粗糙一点的理解就是,在class里面的function叫method。所以,method是和class,instance有关的一种function.
举个栗子:
还是上面的工厂,我们现在加装一个车间,负责把胳膊上色:
1
2
3
4
5
6
|
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来:
1
|
colorful_robot
=
BuildRobot(
2
,
1
)
|
好的我们现在有一个两个胳膊一个头的robot了。这时,我们的robot还是没有上色的,因为我们没有让这个instance进入上色的那个车间。现在我们让这个robot进入车间,涂个红色.
1
|
colorful_robot.paintarm(
'red'
)
|
paint arm: red 。
上面的过程,就是call这个paintarm method。几个点:
如果没有先造一个机器人,这个车间就没有办法给胳膊上色,因此要上色,就必须先造一个机器人出来。所以,method是依赖于instance的.
这个车间只能给这个工厂产出的robot的胳膊上色,你从别的工厂拿一个车过来让他上色,他是不干的。因此,method是依赖于class的。只有这个class创建的instance,才能call这个method.
假如我把上色这个活,外包了。我就在外面另建了个工厂,专门上色,这就是function:
1
2
3
4
|
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讲明白以后,终于能讲self了。通过上面的例子,我们注意到 。
1
|
outsourcing_paint(colorful_robot,
'red'
)
|
1
|
colorful_robot.paintarm(
'red'
)
|
所以self, 就是指由这个class造出来的instance嘛.
以上就是pyhton学习与数据挖掘self原理及应用分析的详细内容,更多关于pyhton数据挖掘self分析的资料请关注我其它相关文章! 。
原文链接:https://blog.csdn.net/weixin_38037405/article/details/120377125 。
最后此篇关于pyhton学习与数据挖掘self原理及应用分析的文章就讲到这里了,如果你想了解更多关于pyhton学习与数据挖掘self原理及应用分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
让我们写一个简单的类在我的脑海中解释: class SomeClass { var happyToUsed = 10 } 并创建一个对象 let someObject = SomeClass(
采用 self 的方法与采用 &self 甚至 &mut self 的方法有什么区别? 例如 impl SomeStruct { fn example1(self) { } fn ex
请观察以下代码(Win10上的python 3.6,PyCharm),函数thread0(self)作为线程成功启动,但是 thread1(self)似乎与thread0(self)不同已设置。 se
backbone.js 开始于: //Establish the root object, `window` (`self`) in the browser, or `global` on the s
做的事: self = self.init; return self; 在 Objective-C 中具有相同的效果: self.init() 快速? 例如,在这种情况下: else if([form
我查看了关于堆栈溢出的一些关于使用[weak self]和[unowned self]的问题的评论。我需要确保我理解正确。 我正在使用最新的 Xcode - Xcode 13.4,最新的 macOS
我面临在以下模型类代码中的 self.init 调用或分配给 self 之前使用 self 的错误tableview单元格项目,它发生在我尝试获取表格单元格项目的文档ID之后。 应该做什么?请推荐。
晚上好。 我对在 Swift 中转义(异步)闭包有疑问,我想知道哪种方法是解决它的最佳方法。 有一个示例函数。 func exampleFunction() { functionWithEsca
我需要在内心深处保持坚强的自我。 我知道声明[weak self]就够了外封闭仅一次。 但是guard let self = self else { return }呢? ,是否也足以为外部闭包声明一
代码 use std::{ fs::self, io::self, }; fn rmdir(path: impl AsRef) -> io::Result { fs::remo
我检查了共享相同主题的问题,但没有一个解决我遇到的这种奇怪行为: 说我有一个简单的老学校struct : struct Person { var name: String var age:
我应该解释为什么我的问题不是重复的:TypeError: can only concatenate list (not “str”) to list ...所以它不是重复的,因为该帖子处理代码中出现的
我有一个 trait,它接受一个类型参数,我想说实现这个 trait 的对象也会符合这个类型参数(使用泛型,为了 Java 的兼容性) 以下代码: trait HandleOwner[SELF
这个问题在这里已经有了答案: Why would a JavaScript variable start with a dollar sign? [duplicate] (16 个答案) 关闭 8
我总是找到一些类似的代码newPromise.promiseDispatch.apply(newPromise, message),我不明白为什么不使用newPromise.promiseDispat
我看到类似的模式 def __init__(self, x, y, z): ... self.x = x self.y = y self.z = z ... 非
mysql查询示例: SELECT a1.* FROM agreement a1 LEFT JOIN agreement a2 on a1.agreementType = a2.agreementTy
self.delegate = self; 这样做有什么问题吗?正确的做法是什么? 谢谢,尼尔。 代码: (UITextField*)initWith:(id)sender:(float)X:(flo
为什么要声明self在类中需要的结构中不需要?我不知道是否还有其他例子说明了这种情况,但在转义闭包的情况下,确实如此。如果闭包是非可选的(因此是非转义的),则不需要声明 self在两者中的任何一个。
这个问题已经有答案了: What does the ampersand (&) before `self` mean in Rust? (1 个回答) 已关闭去年。 我不清楚 self 之间有什么区别
我是一名优秀的程序员,十分优秀!