也许有点和你原本提的方向不符合,不过凌晨醒来睡不着= =,个人浅见和大家分享。
我自己是觉得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