2009年11月17日 星期二

python object and static method

這是一則早該紀錄的文章,只能說我太懶惰了-.-,一切都是從這裡開始的,有天心血來潮想來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
>>> 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"

2 則留言:

  1. 在 Python 3 中,@staticmethod 是不需要的,我的程式都是在 Python 3 環境中執行的。。XD

    回覆刪除
  2. 感謝啦,我到現在都還沒跳到python3 QQ"

    回覆刪除