作者ThxThx (洗洗睡)
看板Python
標題Re: [問題] 函數、程式結構如何設計?
時間Tue Apr 3 05:22:38 2018
也許有點和你原本提的方向不符合,不過凌晨醒來睡不著= =,個人淺見和大家分享。
我自己是覺得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
推 Sunal: 我覺得有些名詞應該要定義一下比較好,另外getter setter用 04/03 06:47
→ Sunal: 的可多了吧 04/03 06:47
推 aszx4510: 上次在版上有看到一篇文 詳細說明setter getter 04/03 12:25
→ aszx4510: Python專門創一個decorator語法支援這個功能 04/03 12:27
property我用的也多,但我認為這跟Java的本質不太一樣。property我自己是認為是一種
『延伸attribute』,就是說通常不會寫一個property來對應一個private變數(Again,
Python裡class是透明的)。這是針對getter的情況。另外我真的很少看到setter,大家在
實戰中真的常常用到!!?
※ 編輯: ThxThx (114.44.249.54), 04/03/2018 13:52:41
推 wallrose: 感謝回文 很有幫助 04/03 15:41
→ s860134: 最早有 set get ,property 後來加入 04/03 19:38
→ s860134: 老實說我不太懂這和 物件導向有啥關係 04/03 19:39
→ s860134: 你一直強調 public 這也和 oo沒啥關係 04/03 19:42
推 Sunal: 其實雖然是沒有真正的private 但也不代表一定要直接存取它 04/03 21:12
→ s860134: 你不希望使用你 module 的成員就用 _ 前墜就好 04/04 02:12
→ s860134: 真正實現了 privte/protect/public 說真的沒啥意義 04/04 02:12