2013年2月4日 星期一

淺談python繼承

最近無聊翻了一下書櫃,找到一本買了卻沒讀完的書,exceptional c++。就稍微看了一下,看看裡面有沒有什麼文章對於寫python code有助益的

那本書條款24(第104頁),是在討論有關使用/濫用繼承。



書中提到的設計準則

盡量採用 aggregation(又名 composition, layering, has-a, delegation) 來取代 inheritance。當我們準備模塑 IS-IMPLEMENTED-IN-TERMS-OF關係時,盡量採用 aggregation 而不要使用 inheritance。

以下是該書列出使用繼承 (inheritance) 而非 arrregation 的理由:

  1. 需要改寫虛擬函數
  2. 我們需要處理protected member
  3. 當我們需要在一個 base subobject 之前建構used object,或是在一個base subobject之後摧毀used object
  4. 當我們需要分享某個共同的virtual base class 或 改寫某個virtual base class的建構程序

以上是C++使用繼承的常見理由。如果換成python語言呢?

1. 需要改寫虛擬函數: 虛擬函數,就是根據runtime時該變數所指向的物件,執行該物件所對應的方法。如果以C++的觀點來看python語言的話,Python語言的每個函數都是虛擬函數。因為python只會執行該物件所對應的函數,他沒有變數的資料型態。所以在python中使用繼承的第一個理由,並不成立。

2. 我們需要處理protected member。第二個理由要稍微改寫一下,才會成立。畢竟python沒有protected member。在python中,要改成 當used class的公開介面無法滿足 using class的需求時,就要使用繼承

3. 第三個和第四個理由python應該和C++一樣。

當然也許有其他理由,這些理由只是書中列的常見理由,我把它拿到Python語言,看看還有哪些理由成立。

之前一直在思考,為什麼 go 語言沒有繼承,看到了這篇文章,我明白了為什麼。


最後附上 go 語言對 inheritance 的說法
go 語言提供的的方法也適用於 python 語言。

沒有留言:

張貼留言