Re: [問題] 函數、程式結構如何設計?
也許有點和你原本提的方向不符合,不過凌晨醒來睡不著= =,個人淺見和大家分享。
我自己是覺得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
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.44.249.54
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1522704161.A.F8E.html
推
04/03 06:47,
7年前
, 1F
04/03 06:47, 1F
→
04/03 06:47,
7年前
, 2F
04/03 06:47, 2F
推
04/03 12:25,
7年前
, 3F
04/03 12:25, 3F
→
04/03 12:26,
7年前
, 4F
04/03 12:26, 4F
→
04/03 12:27,
7年前
, 5F
04/03 12:27, 5F
property我用的也多,但我認為這跟Java的本質不太一樣。property我自己是認為是一種
『延伸attribute』,就是說通常不會寫一個property來對應一個private變數(Again,
Python裡class是透明的)。這是針對getter的情況。另外我真的很少看到setter,大家在
實戰中真的常常用到!!?
※ 編輯: ThxThx (114.44.249.54), 04/03/2018 13:52:41
推
04/03 15:41,
7年前
, 6F
04/03 15:41, 6F
→
04/03 19:38,
7年前
, 7F
04/03 19:38, 7F
→
04/03 19:39,
7年前
, 8F
04/03 19:39, 8F
→
04/03 19:42,
7年前
, 9F
04/03 19:42, 9F
推
04/03 21:12,
7年前
, 10F
04/03 21:12, 10F
→
04/04 02:12,
7年前
, 11F
04/04 02:12, 11F
→
04/04 02:12,
7年前
, 12F
04/04 02:12, 12F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
3
18
Python 近期熱門文章
PTT數位生活區 即時熱門文章