value = 0
step = 1
def increase():
global value
value += step
在同一级目录的其它脚本里, 或者IPython notebook里, 我们可以import这个模块:
import counter
print counter.value
counter.increase()
print counter.value
0 1
模块将数据和函数打包在一起, 使得外界可以方便地使用其"成员"函数改变其中的数据. 但是模块只能import一次, 后续的import不会重新初始化该模块(用一些hack的方法可以重复import):
import counter
print counter.value
1
一个类相当于一个Python脚本, 即一个模块:
class Counter(object):
def __init__(self):
self.value = 0
self.step = 1
def increase(self):
self.value += self.step
其中数据在特殊函数__init__
中定义, 而函数则在class
的下一级定义.
模块需要import才能使用, 类则需要实例化(instantiate). 所谓实例化就是创建(create)的意思. 实际上就是调用了__init__
函数, 分配一块内存并命名为self
, 再初始化其中的数据.
counter = Counter()
print counter.value
counter.increase()
print counter.value
0 1
与模块不同, 类可以多次实例化, 而模块只能import一次:
c1 = Counter()
print c1.value
c1.increase()
print c1.value
c2 = Counter()
print c2.value
0 1 0
类与模块的另一个不同之处在于类可以指定其初始化方式:
class Counter(object):
def __init__(self, step=1):
self.value = 0
self.step = step
def increase(self):
self.value += self.step
counter = Counter(2)
print counter.value
counter.increase()
print counter.value
0 2