2018年1月20日 星期六

Python 3 的 class: instance method、class method、static method的區別

在Python 3當中,一個類別(class)的成員函式(member function/method),可以定義成instance method、class method、或是static method。instance method是物件層級的函式,而class method和static method是類別層級(無法存取物件層式的屬性)的函式(基本大觀念假設不細講)。以下大致比較一下這三者:
  • instance method
    • 物件層級
    • 定義前的修飾字:無
    • 定義語法: def method_name(self, ...): ... 
    • self 是該instance 的 reference
    • 呼叫方法: instance.method_name(...)
    • method當中使用物件/類別屬性的方式
      • self.AAA = 10 # 將物件層級屬性AAA設為 10
      • type(self).BBB = 20 # 將物件類別的類別層級屬性BBB設為 20
      • ClassC.CCC = 30 # 將ClassC的類別層級屬性CCC設為30,ClassC未必是自己的類別
  • class method 
    • 類別層級 (假設類別為 C)
    • 定義前的修飾字:@classmethod
    • 定義語法: def method_name(cls, ...): ...
    • cls 是該 class 的 reference
    • 呼叫方法:C.method_name(...)  或  instance_of_c.method_name(...)
    • method當中使用類別屬性的方式
      • cls.BBB = 20 # 將當下類別層級屬性BBB設為 20
      • C.BBB = 20 # 將C的類別層級屬性BBB設為 20
      • ClassC.CCC = 30 # 將ClassC的類別層級屬性CCC設為30,ClassC未必是自己的類別
  • static method
    • 類別層級 (假設類別為 C)
    • 定義前的修飾字:@staticmethod
    • 定義語法: def method_name(...): ...
    • 呼叫方法:C.method_name(...)  或  instance_of_c.method_name(...)
    • method當中使用類別屬性的方式
      • C.BBB = 20 # 將C的類別層級屬性BBB設為 20
      • ClassC.CCC = 30 # 將ClassC的類別層級屬性CCC設為30,ClassC未必是自己的類別
class method 和 static method 的觀念非常類似,主要差別只在於class method可以使用 cls.BBB的方式來使用自己的類別屬性。上例當中,使用 cls.BBB 和 C.BBB 看似一樣,實際上有一點小差別。當我們用 C1 繼承 C 的時候,cls.BBB 會是 C1 的類別屬性,但是 C.BBB 仍是 C的類別屬性,不會因為繼承而變成 C1 的屬性。最主要的差別就在這裡了。


Python讀寫utf-8的文字檔

Python開啟文字檔的時候,encoding這個參數是大家比較不常用的:
with open(f_name, 'w', encoding='utf-8') as f_out:
    ....
    ....
encoding是指文字檔的編碼。如果要讀寫utf-8的文字檔,編碼會是以下兩者之一:
  • encoding='utf-8':純utf-8文字檔 (常見於linux)
  • encoding='utf-8-sig':檔案開頭有加BOM (常見於Windows上的utf-8檔)
在讀檔時,如果用其中一者開啟失敗,可以換一個試看看。

encoding如果不指定,會是作業系統的預設選項 (使用者應該可以改,但我沒試過)。如果在linux系列,多半會是utf-8 (有不是的嗎?);如果在較舊的Windows,則是 big5/cp950 。當我們的程式碼可能在多個平台執行時,最好把encoding作明確的設定,免得在讀寫共用的文字檔案時,因為encoding而發生執行錯誤。

2018年1月2日 星期二

推背圖44象之精闢解釋



大家多半憑著雙羽四足,就猜測是指著習近平與馬英九。
「習」是小鳥白天學飛,所以雙羽指鳥、指習,是沒有問題的。
這個部份,在馬英九與習近平上任之前,就有人解開了。

去年,我再來看44象時,發現了更有意思的地方。
「雖非豪傑」四字,有不突出的意思,
所以「近平」二字也有解釋了。

真不知當年,李淳風是怎麼算出這些東西的。

推背圖原文:


【第四十四象丁未離上坎下未濟】
讖曰

日月麗天
群陰懾服
百靈來朝
雙羽四足

頌曰

中國而今有聖人
雖非豪傑也周成   <==近平
四夷重譯稱天子   <==任期無限延長
否極泰來九國春