這是一則早該紀錄的文章,只能說我太懶惰了-.-,一切都是從這裡開始的,有天心血來潮想來review一下design pattern,結果跑去看良葛格的文章simple factory ,可是問題跑出來了,他下面的python code我不能跑,會出現錯誤跑出
TypeError: unbound method getMessage() must be called with MessageFactory instance as first argument (got str instance instead)
因為MessageFactory.getMessage("caterpillar@openhome.cc", "Hi")這行程式碼的MessageFactory沒有初始化出來,這和我們預期要的結果不同,我們原本就是要用工廠來封裝製作物件的過程,所以我們並不需要將messageFactory 的 instance建立出來,後來找到了class method differences in python : bound, unbound , and static文章,原來只要將def getMessage(addr, msg):上面加上@staticmethod decorator就不會有錯誤了!
另外也讓我了解到python的物件特性
Class Test(Object): def method_one(self): print "Called method_one" def method_two(): print "Called method_two" a_test = Test() a_test.method_one() a_test.method_two()
一個bound function 會被翻譯成為
a_test.method_one() ---> Test.method_one(a_test)
所以使用method_two就會寫少一個argument
所以使用method_two就會寫少一個argument
>>> a_test = Test() >>> a_test.method_two() Traceback (most recent call last): File " ", line 1, in TypeError: method_two() takes no arguments (1 given)如果你要改變這種情形 可以用decorator
class Test(object): def method_one(self): print "Called method_one" @staticmethod def method_two(): print "Called method two"
在 Python 3 中,@staticmethod 是不需要的,我的程式都是在 Python 3 環境中執行的。。XD
回覆刪除感謝啦,我到現在都還沒跳到python3 QQ"
回覆刪除