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