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

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

原文地址:https://www.cnblogs.com/TMesh/p/11737341.html

时间: 2024-07-28 22:37:50

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

python中if __name__ == "__main__":的解释

当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个模块的 __name__ 的值取决于您如何应用模块.如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名.但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__". //////

3分钟,让你学会区分python中self与__init__?

_init__ 代表初始化 你可以建立一个类 然后每次实例化的时候,就会调用这个函数 我举个栗子 class hehe: def __init__(self): print('gao') a=hehe() 这个init存在的意义,往往是赋值,或者作为启动内部方法用的 做个比喻,你建立一个类,就像建立了一个班级,每个实例,就是一个学生,但只要学生进入了班级,就要先给他发一套,对应这个班级要上课的书,那么这个过程,发书,赋值,就是在init里面做 至于self,就是代表这一个学生,一个学生,首先每个

Python中super()和__init__()方法

采用新式类,要求最顶层的父类一定要继承于object,这样就可以利用super()函数来调用父类的init()等函数, 每个父类都执行且执行一次,并不会出现重复调用的情况.而且在子类的实现中,不用到处写出所有的父类名字,符合DRY原则. https://rhettinger.wordpress.com/2011/05/26/super-considered-super/ https://www.zhihu.com/question/20040039 https://taizilongxu.git

Python中局部变量与全局变量的解释

num = 5 def  func(): num += 1 print(num) print(num) 输出:UnboundLocalError: local variable 'num' referenced before assignment 翻译:局部变量错误:变量 "num" 未被定义就被应用了.由此再次证明了这里定义了一个局部变量,而不是使用的全局的 "num" 总结:当已经在函数体外的变量已经被定义为全局变量后,在函数体内又被重新赋值一遍,这时的变量在函

(转载)Python中:self和__init__的含义 +

(注:原文地址 Python中:self和__init__的含义 + 为何要有self和__init__) 背景 回复: 我写的一些Python教程,需要的可以看看 中SongShouJiong的提问: Python中的self,__init__的含义是啥? 为何要有self,__init这些东西? 解释之前,先说几句 1.到目前为止,我虽然也已写了不算很少的python的代码,但是,还真的没有太多接触self和__init__这两个东西. 只能算是大概了解. 2.为了搞懂其含义,现学现卖,去看

Python中:self和__init__的含义 + 为何要有self和__init__

Python中:self和__init__的含义 + 为何要有self和__init__ 背景 回复: 我写的一些Python教程,需要的可以看看 中SongShouJiong的提问: Python中的self,__init__的含义是啥? 为何要有self,__init这些东西? 解释之前,先说几句 1.到目前为止,我虽然也已写了不算很少的python的代码,但是,还真的没有太多接触self和__init__这两个东西. 只能算是大概了解. 2.为了搞懂其含义,现学现卖,去看了些资料,然后整理

python中__init__()、__new__()、__call__()几个魔法方法的用法

关于__new__()的用法参考: http://www.myhack58.com/Article/68/2014/48183.htm 正文: 一.__new__()的用法: __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__()负责将类的实例化,而在__init__()启动之前,__new__()决定是否 要使用该__init__()方法,因为__new__()可以调用其他类的构造方法或者直接返回别

python中__init__()、__new__()、__call__()、__del__()用法

http://www.myhack58.com/Article/68/2014/48183.htm 正文: 一.__new__()的用法: __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__()负责将类的实例化,而在__init__()启动之前,__new__()决定是否 要使用该__init__()方法,因为__new__()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例. 如果将类

python类中super()和__init__()的区别

本文和大家分享的主要是python开发中super()和__init__()的区别,希望通过本文的分享,对初学者学习这部分内容有所帮助. 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'creat A ', Base.__init__(self) class chi