Re: [問題] 函數、程式結構如何設計?

看板Python作者 (洗洗睡)時間7年前 (2018/04/03 05:22), 7年前編輯推噓4(408)
留言12則, 4人參與, 7年前最新討論串2/2 (看更多)
也許有點和你原本提的方向不符合,不過凌晨醒來睡不著= =,個人淺見和大家分享。 我自己是覺得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
我覺得有些名詞應該要定義一下比較好,另外getter setter用
04/03 06:47, 1F

04/03 06:47, 7年前 , 2F
的可多了吧
04/03 06:47, 2F

04/03 12:25, 7年前 , 3F
上次在版上有看到一篇文 詳細說明setter getter
04/03 12:25, 3F

04/03 12:26, 7年前 , 4F
#1QIcP7lk (Python) setter getter 是很常用的東西
04/03 12:26, 4F

04/03 12:27, 7年前 , 5F
Python專門創一個decorator語法支援這個功能
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
最早有 set get ,property 後來加入
04/03 19:38, 7F

04/03 19:39, 7年前 , 8F
老實說我不太懂這和 物件導向有啥關係
04/03 19:39, 8F

04/03 19:42, 7年前 , 9F
你一直強調 public 這也和 oo沒啥關係
04/03 19:42, 9F

04/03 21:12, 7年前 , 10F
其實雖然是沒有真正的private 但也不代表一定要直接存取它
04/03 21:12, 10F

04/04 02:12, 7年前 , 11F
你不希望使用你 module 的成員就用 _ 前墜就好
04/04 02:12, 11F

04/04 02:12, 7年前 , 12F
真正實現了 privte/protect/public 說真的沒啥意義
04/04 02:12, 12F
文章代碼(AID): #1QmfyX-E (Python)
文章代碼(AID): #1QmfyX-E (Python)