在python中,類可以提供模塊級別之下的命名空間。
如果一個模塊寫很多函數,某些函數之間共同完成一組功能,用類會看起來更清晰,在調用時候也會更好,對於ide補全有更小范圍的限定提示。
類提供 繼承 組合 多重實例 通過繼承進行定制 運算符重載(就是類的雙下划線方法__del__ __call__ __str__ __iter__ ........)。
類和模塊都可以建立命名空間樹,模塊中的功能叫函數,類中的一般稱為方法。
python中模塊的方法也可以像類一樣被繼承和定制。
下面是兩個文件。
modulea.py
# coding=utf8 x = 1 def fun1(): print 'modulea',x def fun2(): print 'modulea',x*2
moduleb.py
# coding=utf8 import modulea print modulea.__dict__ modulea.fun1() modulea.fun2() def fun1(): print 'moduleb',modulea.x*10 modulea.x = 11 modulea.fun1 = fun1 print '替換后' modulea.fun1() modulea.fun2()
運行noduleb.py

modulea.fun1() modulea.fun2()
這種方法和類實例調用方法形式上一樣
modulea的fun1函數被改變了,類似類繼承。
如果使用類,里面是
class A(object): def __init__(self,x): self.x = x def fun1(self): print self.x * 1 def fun2(self): print self.x * 2
這樣在x在初始化賦值和繼承修改fun1更方便,類是一個對象工廠,可以產生多重實例,使用上面模塊的方式就不行。但最簡單的單利模式就是使用模塊,例如a模塊有一個b對象,其余所有py文件中都import a,使用a.b來操作a,這就達到天然的單例模式了;但要注意的是一定要import a ,a.b這種用法,不可使用from a import b,然后操作b,這樣會使b脫離了a的命名空間,每個py文件中的b對象將是不同的了,就不是單例模式了。
類還提供了運算符重載,這是模塊方式不具備。
實例屬性,在類中的所有普通方法(帶self的方法)始終是操作同一個變量,
使用模塊時候,在函數中操作同一個變量,變量必須是全局變量,函數里面的局部變量會比全局變量優先。
在一個大文件中,分成幾個類是必須的,更清晰的結構,不至於全局變量到處是,和函數過多結構不清晰。
面向對象和面向過程的區別是 狗.吃屎 和 吃.狗屎,使用面向對象在別處調用時候那就是個爽快,在調用時候比寫的時候體現得明顯。
使用類怎么模擬模塊的行為。那就是模塊里面的一個類全部使用staticmetod,由類來提供命名空間。
例如
class Bb: @staticmethod def fun1(a): print a *1 @staticmethod def fun2(a,b): return a+b print Bb.fun2(1,2)
stackflow上說明,這種情況不要使用這種全部靜態方法,使用模塊加函數就可以了。
模塊 + 全局變量 + 函數 類似於 類 + 屬性 + 方法的單例模式類。
