python類和模塊區別,python命名空間


在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上說明,這種情況不要使用這種全部靜態方法,使用模塊加函數就可以了。



模塊 + 全局變量 + 函數 類似於 類 + 屬性 + 方法的單例模式類。



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM