python中self与__init__怎么解释能让小白弄懂?

这个问题其实没那么简单. 只说一下自己的理解.

python 里所有的 object 都有三个属性, 标识(identity), 类型(type) 和值(value). 其中 identity 可以用 id 函数获得, CPython 里的实现是 object 的内存地址. 值就是 object 具体存放的数据, 而 type, object 的类型, 决定了可以对数据所进行的操作. 这里举个例子, tuple (1, 2, 3)和 list [1, 2, 3]虽然存着同样的数据, 但是一个是 tuple, 一个是 list, 所以能够进行的操作是不一样的.

object 的类型可以由 type 函数获得.

当你定义了一个 class, 其实就定义了一个类型, 比方说:

class Foo:
pass foo = Foo()
type(foo) # return __main__.Foo

可以看到 foo 的类型就是 Foo . 其实这也很好理解, 因为 class Foo决定了实例(instance) foo所能够使用的方法. 注意 Foo 并没有定义自己的__init__方法.

那这个__init__是用来做什么呢. 如果你用过其他的语言, 比如 JAVA 或者 C, 你就会知道, 指定变量的类型和对变量的初始化其实是分开的. 比如在 C 里面, 你可以写:

int a;
a = 1;

这里定义变量 a 的类型和对 a 的初始化是分开的. 但实际上, 通常情况下我们定义一个变量或者实例, 都想让它存储一些数据. 像上面定义的 class Foo什么数据都没有, 所以没什么用处. __init__方法就是 python 提供的用来初始化数据的一个简便形式. 在你使用像 foo=Foo()这种形式创建实例的时候, Foo__init__方法(如果有的话)就会被自动调用.

进一步的, 可以猜到, 既然名字叫做初始化, 那么在初始化之前, 这个实例必然已经存在了. 确实如此. python 里面这个过程其实也是分两步, 即先调用 __new__ 方法来创建一个实例, 然后再调用__init__. 如果你意识到 class Foo其实也是一个 python object, 它又是怎么创建的呢? 那么恭喜你开始探究 python 里 object 的本源. 先去看文档吧.

\3. Data model - Python 3.8.0 documentationdocs.python.org

至于第二个问题, self 是什么. 那可以想想, 为什么类的方法和普通的函数写法有点不一样? 如果不用self呢?

class Bar:
def __init__(x):
pass
bar = Bar(5)
# TypeError: __init__() takes 1 positional argument but 2 were given

错误告诉你, __init__需要 1 个 参数, 而你给了 2 个. 多出了的这个参数就是 bar 这个实例自己. 刚才我们说, 在调用 __init__的时候, bar 其实已经存在了, 所谓初始化, 自然要初始化自己呀. 这就是它的名字为什么叫 self.

再多说一句, 这个self不是必须的. 比如 JAVA和 C++ , 都是用 this指代自身, 而没有把它显式的作为参数. 这是个语言设计问题. 有开发者提议把 self去掉, 不过 Python 的创始人 Guido 没有同意. 我觉得保留 self可以保持一致性, 类方法就是第一个参数是自身的普通函数. 你可以动态地给类添加方法:

class Buz:
pass def buz(cls, x):
return x + 1 Bar.buz = buz
Bar().buz(1) # return 2

python中self与__init__怎么解释能让小白弄懂?的更多相关文章

  1. Python中self和__init__的含义与使用

    原文地址https://blog.csdn.net/love666666shen/article/details/78189984 Python中的self 在Python中的类Class的代码中,常 ...

  2. python中魔法方法__init__,__str__,__del__的详细使用方法

    1. python中的魔法方法, 类似__init__, __str__等等,这些内置好的特定的方法进行特定的操作时会自动被调用 2. __init__的使用方法 class 类名(object):  ...

  3. python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)

    转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...

  4. Python中__new__与__init__介绍

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  5. python中 __new__和__init__

    python这两个函数和类的实例化有关. __init__是实例化完成之后调用的,会对生成的对象实例做一些修饰 __new__是python新类型才有的,它更像是c/c++里面的构造函数,因为这个函数 ...

  6. Python 中__new__()和__init__()的区别

    转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...

  7. Python中的super().__init__()

    Python里的super().init()有什么用? 简单的说super().__init__(),就是继承父类的init方法,同样可以使用super()去继承其他方法. 下面是三种不同的继承.调用 ...

  8. Python中__new__和__init__区别

    __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值 1.在类中,如果__new__和__init__同时存在,会优先调用 ...

  9. Python中__new__和__init__的区别与联系

    __new__ 负责对象的创建而 __init__ 负责对象的初始化. __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回 ...

随机推荐

  1. R_Studio(教师经济信息)逻辑回归分析的方法和技巧

    使用R语言对"教师经济信息"进行逻辑回归分析 (1)按3:1的比例采用简单随机抽样方法,创建训练集和测试集 (2)用训练集创建逻辑回归模型 (3)用测试集预测贷款结果,并用tabl ...

  2. linux下面实时查看进程,内存以及cpu使用情况使用命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令查看整体情况,如图: 但是这样虽然看的东西多,但是闲的比较 ...

  3. 分布式-信息方式-JMS可靠性机制

                        JMS的可靠性机制1.消息接收确认        JMS消息只有在被确认之后,才认为已经被成功地消费了.消息的成功消费通常包含三个阶段:客户接收消息.客户处理消 ...

  4. 调用百度API写了一个js翻译小工具

    目前还未完成的功能有:textarea高度自适应,移动端与pc端都写了.效果如图: html: <!DOCTYPE html> <html lang="en"&g ...

  5. C++入门经典-例6.19-字符串类型之修改string字符串的单个字符串

    1:头文件 #include <string> 声明一个string变量,形式如下: std::string s; 初始化string类型的变量: std::string s1(" ...

  6. C++入门经典-例4.4-循环嵌套之求n的阶乘

    1:代码如下: // 4.4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  7. C语言中的!!

    C语言中!!的作用是?看例子: #include <stdio.h> int main() { ; printf("test=%d !test=%d !!test=%d\n&qu ...

  8. Python学习笔记:类

    类可以将数据与函数封装起来,用一个例子解释,先定义一个类: class athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.n ...

  9. spark MLlib 概念 5: 余弦相似度(Cosine similarity)

    概述: 余弦相似度 是对两个向量相似度的描述,表现为两个向量的夹角的余弦值.当方向相同时(调度为0),余弦值为1,标识强相关:当相互垂直时(在线性代数里,两个维度垂直意味着他们相互独立),余弦值为0, ...

  10. elk5.0 版本遇到的安装问题

    问题1:max_map_count不够大 max virtual memory areas vm.max_map_count [65536] likely too low, increase to a ...