作者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://webptt.com/cn.aspx?n=bbs/Python/M.1522704161.A.F8E.html
1F:推 Sunal: 我觉得有些名词应该要定义一下比较好,另外getter setter用 04/03 06:47
2F:→ Sunal: 的可多了吧 04/03 06:47
3F:推 aszx4510: 上次在版上有看到一篇文 详细说明setter getter 04/03 12:25
5F:→ 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
6F:推 wallrose: 感谢回文 很有帮助 04/03 15:41
7F:→ s860134: 最早有 set get ,property 後来加入 04/03 19:38
8F:→ s860134: 老实说我不太懂这和 物件导向有啥关系 04/03 19:39
9F:→ s860134: 你一直强调 public 这也和 oo没啥关系 04/03 19:42
10F:推 Sunal: 其实虽然是没有真正的private 但也不代表一定要直接存取它 04/03 21:12
11F:→ s860134: 你不希望使用你 module 的成员就用 _ 前坠就好 04/04 02:12
12F:→ s860134: 真正实现了 privte/protect/public 说真的没啥意义 04/04 02:12