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. Trie树(字典树)整理

    字典树 (Trie) 用于存储字符串.树的每条边恰好表示一个字符,每个节点代表从根到该节点的路径所对应的字符串. 简介与操作实现可见蓝书P82~83. Trie字典树很好地利用了前缀,节省了很多空间. ...

  2. 文章翻译:ABP如何在EF core中添加数据过滤器

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Articles%5CHow-To%5Cadd-custom-data-filter-ef-cor ...

  3. CF1213E Two Small Strings

    题目链接 问题分析 由于三个字母是等价的,所以大致可以分为如下几种情况: aa, ab ab, ac ab, ba ab, bc 不难发现,第\(3\)中情况可能造成无解(\(n>1\)时),而 ...

  4. dependencies和devDependencies的区别?

    当我们项目需要下载一个模块的时候,我们安装npm包(在项目目录下面npm install module_name)的时候,很多时候我们会在后面加上–save-dev 或 –save.这两个参数代表什么 ...

  5. erlang实现排列组合问题

    今天在公司做一个日志分析的任务,在做统计的时候,遇到这样一个问题, 之前已经将数据拆分好,出现这样一张中间表Table,简略写如下: A属性 B属性 C属性 D属性 1       3         ...

  6. 数字 kotlin (1)

    数字Kotlin 处理数字在某种程度上接近 Java,但是并不完全相同.例如,对于数字没有隐式拓宽转换(如 Java 中 int 可以隐式转换为 long ——译者注),另外有些情况的字面值略有不同. ...

  7. csp2019 Emiya家今天的饭题解

    qwq 由于窝太菜了,实在是不会,所以在题解的帮助下过掉了这道题. 写此博客来整理一下思路 正文 传送 简化一下题意:现在有\(n\)行\(m\)列数,选\(k\)个数的合法方案需满足: 1.一行最多 ...

  8. 关于 LDTP 操纵 windows 控件。

    LDTP doc:  https://ldtp.freedesktop.org/user-doc/ 对于 web 自动化,我们用 Selenium, 但是对于 windows 控件,我们可以使用 LD ...

  9. Android 面试汇总<三>

    1.3 计算机网络 基础 Q:五层协议的体系结构分别是什么?每一层都有哪些协议? 技术点:网络模型.协议 思路:分条解释每层名字以及协议 参考回答: 物理层 数据链路层:逻辑链路控制LLC.媒体接入控 ...

  10. Java -- 通过 URLConnection 进行http请求中文乱码

    对writer和reader指定字符集 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8 ...