变量 是不会被无端创造出来的,你需要给它指派一个地方存活,这个 地方
就是内存。这个指派,可以通过赋值
来实现,或者是一个类的实例化,或者 特定的方法
也能完成赋值。
普通的赋值方式很简单,比如:
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 很像一个 做饼干的模具
,面粉团要进入这个模板,才能出来一个雏形。那么:
当然,还有一个非常非常特殊的情况,就是手里永远只有一个面粉团,再怎么进入模具(实例化),出来的都是同一个东西 (id 一样)。但这种情况,我们基本上用不到,可以不用去关注。
一般情况下,我们也不需要去关心 实例化 这个名词,有些时候 实例化
的过程显得过于自然,以至于我们可能会意识不到这是一次实例化。比如下面的代码中:
a = 1
b = int(1)
a = 1
,其中 1
是一个常量;而 b = int(1)
就属于一次 实例化
的过程了,因为本质上来说,int
是一个 type 类型,也是一个 Class。