赋值与实例化

赋值

变量 是不会被无端创造出来的,你需要给它指派一个地方存活,这个 地方 就是内存。这个指派,可以通过赋值来实现,或者是一个类的实例化,或者 特定的方法 也能完成赋值。

普通的赋值方式很简单,比如:

a = 1
b, c, d = 2, 3, 4

除了常见的赋值之外,我们还可以对一个对象上进行子属性的赋值,比如下面示例:

>>> class AClass(object):
...     pass
...
>>> a = AClass()
>>> a.b = 1
>>> a.c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'AClass' object has no attribute 'c'

上面代码中,我们获得 (实例化) 了一个 a 的变量,而且进行了 a.b = 1 的赋值,只是 a.c 这个子属性,还不存在,尝试去调用这个属性的时候,就会报错 AttributeError。
我们换一个方式,赋予 a.c 一个值,也就是本文开头说的 特定的方法,下面呈现的是简单的,后续其它章节在 Magic Methods 中会有更具体的介绍:

>>> a.__dict__['c'] = 2
>>> a.c
2

实例化

在上面内容中,我们构建了一个 Class,名为 AClass。Class 一般不会直接拿来用,都是先 实例化 之后,再行使用。
Class 很像一个 做饼干的模具,面粉团要进入这个模板,才能出来一个雏形。那么:

  1. 有形状的面粉团,虽然从模具里来,但是它和模具之间是独立的;
  2. 两个面粉团之间,虽然形状一样,但是,它们彼此之间是独立的。

当然,还有一个非常非常特殊的情况,就是手里永远只有一个面粉团,再怎么进入模具(实例化),出来的都是同一个东西 (id 一样)。但这种情况,我们基本上用不到,可以不用去关注。

一般情况下,我们也不需要去关心 实例化 这个名词,有些时候 实例化 的过程显得过于自然,以至于我们可能会意识不到这是一次实例化。比如下面的代码中:

a = 1
b = int(1)

a = 1 ,其中 1 是一个常量;而 b = int(1) 就属于一次 实例化 的过程了,因为本质上来说,int 是一个 type 类型,也是一个 Class。