2014/10/12

Python 另人頭痛的 Singleton 問題

  最近學習使用Python 寫網路爬蟲程式,除了一些動態及需要輸入查詢條件的網頁問題外,最惱人的還是在Python 語法上,因為對Java 較熟悉,程式撰寫習慣會以OO的方式做思考,所以將一些Python 程式碼要重構時發現光一個Singleton pattern 的寫法就夠人煩的了,在Java 中是簡單的不得了,  在Python 中卻是寫法好幾種,重點是不夠簡單易懂。請參考 Stack Over Flow 網站上以下這篇討論:

 Creating a singleton in Python

以下是其中一種個人認為比較簡單的方法,缺點是無法避免被誤繼承的問題,但還不致於造成大問題。

class Singleton:
    __single = None
    
    def __init__(self):
        if Singleton.__single:
            raise Singleton.__single
        Singleton.__single = self
        self.name = None
        
    def __str__(self):
        pass
    
    def dump(self):
        if self.name == None:
            print ''
        else:
            print "Name : " + self.name
        
    def setName(self, name):
        self.name = name
        
    def getName(self):
        return self.name
        
class WorldSingleton(Singleton):
    pass

  個人是習慣使用Eclipse 搭配 PyDev 這個plugin 來開發 python 程式,以上程式碼無法在開發時就先警告,要到執行階段才能發現。