也許有點和你原本提的方向不符合,不過凌晨醒來睡不著= =,個人淺見和大家分享。
我自己是覺得Python是一個環繞資料來設計的物件導向語言,而且這樣的OOP和Java的OOP
有相當的差異。例如說,幾乎不會看到Python class會有getter/setter。物件基本上是
透明的,大部分情況所有內部的資料都可以從外面讀取。
這樣的情況下,會有兩種設計方向:
1. 既然都是public members,class不需要有太多函式,用外部function來操作物件。
2. 讓上層物件呼叫子物件的member functions。一個class的member functions代表其
對子物件的所有操作。
Python的答案比我接觸過的語言都更偏向2。事實上,我覺得第一種情況Python內建的
list、dict、set還有一堆一起組合利用的內建函數(除了常見的sum、len、zip,還有一堆
在itertools和functools裡)就在做這件事。使用者大部分的時候都在設計怎麼操作儲存
1.的物件。如果你有看過開源Python library的話,你會發現最核心的code通常都是class
(設計物件來操作資料),只有helper functions和最外層的API會是function。
針對第一種情況,官方文件有個頁面叫Python Data Model(很硬,不建議直接看)就在講
怎麼透過定義特殊的member functions來設計好用的class。這裡的『好用』指的是可以用
Pythonic的方式來操作,例如可以定義obj[1:2, :]或reversed(obj)是什麼意思這樣。
回到你的問題,原本的兩個例子我想都是合理、看情況使用的用法。但你提到當程式越來
越複雜很難處理,我覺得癥結點也許是沒有正確設計class來代表、儲存想要處理的資料,
而這是Python常被忽略(因為語法太簡單了好像隨便寫寫都可以)卻又很重要的特色之一
,而且我發現版上很少有這樣的討論。
不小心打太多了,希望有高手來指導一下scalable python project的開發經驗。
最後放個最近看到的小型server框架Flask的source code當作例子,我想只要打開每個檔
案瞄一眼就了解我的意思了。
https://github.com/pallets/flask/tree/master/flask