九月 24, 2011, 11:44 a.m.

      Python初學者對Instance Methods, Static Methods, Class Methods這三個名詞比較容易混淆,從字面意思上來看,Instance Methods是和實例(Instance)掛鉤、Static Methods大概和Java/C++的靜態方法差不多、而Class Method就不知道該如何解釋了,在這裡我們以實例來說明這三者的區別和用法。

      最常見的Instance Methods是以第一個傳入參數(argument)為self為標誌,其處理的是實例屬性(instance attributes):

      class Multi:
          def imeth(self,x):
              print self, x
      

      使用時則是必須先實例化(instantiate)類別(class)才能呼叫(invoke):

      >>> obj = Multi()
      >>> obj.imeth(1)
      <__main__.Multi instance…> 1
      >>> obj.imeth(obj, 2)
      <__main__.Multi instance…> 2
      

      Static Methods的確和Java/C++一樣,是用來處理類別屬性(class attributes)的,定義如下:

      class Multi:
          x = 0
          @staticmethod
          def smath():
              Multi.x = Multi.x+1
              print x
      

      使用時可以自類別呼叫或自實例呼叫:

      >>> obj = Multi()
      >>> obj.smeth()
      1
      >>> Multi.smeth()
      2
      

      最後Class Methods幾乎和Static Method一樣,除了Class Method的第一個參數(argument)是方法(method)被呼叫時使用的類別、或實例所屬的類別,定義如下:

      Class Multi:
          @classmethod
          def cmeth(cls, x):
              print cls, x
      

      使用方法如下:

      >>> obj = Multi()
      >>> Multi.cmeth(5)
      __main__.Multi 5
      >>> obj.cmeth(6)
      __main__.Multi 6
      

      注意__main__.Multi和<__main__.Multi instance…>的區別,一個是類別(class)一個是實例(instance),所以class method在繼承關係(inheritance)中,比方說你想要寫一個factory method(實例化類別用),用classmethod可以讓你正確的實例化該實例化的類別,即使呼叫該factory method的是原類別的子類別(subclass)。

      python
      八月 15, 2011, 4:12 p.m.

      問題描述: 在Linux下可將帶Unicode的字串利用print指令輸出到終端,其中將如果輸出導向一個檔案時,python會顯示UnicodeEncodeError異常,如下:

      $ cat example.py 
      print u'Example: \u00F1'
      $ python example.py 
      Example: ñ
      $ python example.py > /dev/null
      Traceback (most recent call last):
        File "example.py", line 1, in <module>
          print u'Example: \u00F1'
      UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 9: ordinal not in range(128)
      

      問題解析:這是由於標準的命令列終端是帶有編碼功能的,但若不是輸出到終端如輸出到檔案時,我們必須將unicode string手動編碼為byte string,最簡單的方法是利用字串類別內建的方法str.encode([encoding[, errors]]),範例如下:

      print u'Example: \u00F1'.encode('utf-8')
      

      這對擺在crontab中進行的worker process非常重要,因為這樣你就能夠在log日誌中提供更詳細的資訊以利於管理。

      參考資料:

      1. UnicodeEncodeError when redirecting stdout
      2. http://wiki.python.org/moin/UnicodeEncodeError

      python unicode
      七月 31, 2011, 8:20 p.m.

      Favicon(XHTML 1.0 version):
      代換href里的圖片地址

      <!DOCTYPE html 
            PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      <html
            xmlns="http://www.w3.org/1999/xhtml" 
            xml:lang="en-US"
            lang="en-US">
      <head profile="http://www.w3.org/2005/10/profile">
      <link rel="icon" 
            type="image/png" 
            href="http://example.com/myicon.png">
      […]
      </head>
      […]
      </html>

      RSS Autodiscovery:
      在Head加入以下代碼,并代換title和hred

      <link rel="alternate" type="application/rss+xml" 
        title="RSS Feed for petefreitag.com" 
        href="/rss/" />

      Refenrences:

      1. How to add RSS Autodiscovery to your site
      2. How to Add a Favicon to your Site

      html favicon rss