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. 暑假集训 div1 B Derangement 交换数字 思维死角

    B. Derangement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. js获取iframe里面的dom

    最近在写页面遇到了问题,一个dom好多地方用到,然后我就单独写了个html页面,然后用iframe引入,但是,想获取iframe里面input的value,获取不到input,后面才知道原来js不能直 ...

  3. 安装MongoDB到CentOS 6

    MongoDB是一个面向海量文档存数据动态存储的NoSQL型数据库.是一个除了用于关系型数据库如MySQL,PostgreSQL数据库表格的格式,和微软SQL以外的一种数据模型存储形式.他的功能包括了 ...

  4. Jmeter -- 监听 -- 查看每个请求的启动时间等信息

    步骤: 1. 添加监听器 Add --> Listener --> View Results in Table 2. 执行线程组,查看监听信息

  5. python3笔记三:运算符与表达式

    一:学习内容 算术运算符:+(加).-(减).*(乘)./(除).%(取模).**(求幂).//(取整) 赋值运算符:= 复合运算符:+=.-=.*=./=.%=.**=.//= 位运算符:& ...

  6. yue

    1. 字节流与二进制文件 1.我的代码 public class Student { private int id; private String name; private int age; pri ...

  7. redis事务命令

    MULTI开启事务,相当于mysql 的START TRANSACTION; EXEC执行事务 ,相当于mysql的commit; DISCARD放弃执行事务,相当于mysql的rollback; W ...

  8. 编写个shell脚本将/home/test 目录下大于10K的文件转移到/tmp目录下

    #!/bin/sh cd /home/test for i in `ls -l |awk '{if($5>10240) {print $9}}'` do mv $i /tmp done

  9. 转 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)

    这是本系列的最后一篇,主要是select_related() 和 prefetch_related() 的最佳实践. 第一篇在这里 讲例子和select_related() 第二篇在这里 讲prefe ...

  10. Input 输入框

    Input 输入框 通过鼠标或键盘输入字符 <el-input v-model="input" placeholder="请输入内容"></e ...