Python设计指南:

Vec*_*tor 5 python oop encapsulation interface

我是一位非常有经验的开发人员 - 多年来使用Delphi,C#和C++完成了许多繁重的工作.我一直非常重视结构化编程,OOP,松耦合模块化设计等指南 - 因为我使用的所有语言都有内置的强制执行这些概念的方法 - 访问控制,静态类型,接口和抽象类支持等 - 我依靠这些来构建我的代码.

现在,我已经用Python乱画了几个月.我对它的许多精彩功能印象深刻 - 但我非常怀念内置的约束,这使得代码模块化和组织变得容易.而且,不幸的是,我看到很多用Python编写的"意大利面条代码",甚至来自非常可敬的来源.我不会单独出去任何人,但是我有一些由大联盟pythonistas编写的书籍,其中充满了充满设计的例子(更好的说 - "反设计")让我不寒而栗.在我看来,因为Python很容易使用,所以它也很容易被滥用.

我在Python编写代码时会尝试自我约束,但我发现需要执行大量额外的工作,而且我必须根据自己的设计记忆设置并遵守约束,而无需语言帮助一点都不 而且由于没有"编译时间"检查,这是非常困难的 - 通常你不会发现设计缺陷,直到你真正运行该段代码.

所以,我正在寻找非常具体的信息:一些例子或更好的仍然是一关于WELL STRUCTURED Python设计和设计技术的书 - 如何最好地实现封装,间接,非常松散耦合的设计等.

来自一位着名的蟒蛇书籍作者的糟糕设计IMO - (混淆)

def populateList(self, selecteddisk=None):
selected = None ***#Bundling - coupling:*** 
self.listWidget.clear()
for disk in self.disks.inOrder():
item = QListWidgetItem(QString("%1 of %2/%3 (%L4)") \
.arg(disk.name).arg(disk.owner).arg(disk.country) \
.arg(disk.teu))
self.listWidget.addItem(item)
***#Bundling - coupling:*** 
if selecteddisk is not None and selecteddisk == id(disk):
    selected = item
    if selected is not None:
    selected.setSelected(True)
    self.listWidget.setCurrentItem(selected)
Run Code Online (Sandbox Code Playgroud)

S.L*_*ott 2

我发现,在编译之前编写代码本身时,仅根据我自己对设计的记忆来实现和编译遵守约束的代码需要大量额外的工作,而无需语言的帮助。有些 IDE 提供了帮助,但语言本身根本没有为我提供任何帮助。

由于“编译时”检查似乎永远无法帮助我找到普通的逻辑错误,因此变得更加困难 - 通常,直到实际运行该代码段时,您才会发现设计缺陷。

Python设计和设计技巧...如何最好地实现封装,

通过封装。在 Java 和 C++ 等语言中,“封装”已发展为“在各处使用私有内容”。在Python 中根本不支持这一点。

我们这里都是成年人。

您仍然像在其他语言中一样进行封装。然而,没有这个词private

Python 提供属性、装饰器和重写来__getattribute__实现各种封装技术。

间接,

通过引用其他对象。我不清楚您在这里遇到的具体问题,但也许您向函数传递了一些错误类型的参数。避免这种情况的方法是阅读您自己编写的文档字符串。

非常松散耦合的设计等

通过进行依赖注入。再次。在松散耦合方面,Python 的工作方式与其他所有语言一样。

您应该大量研究并使用文档字符串。

您可能想使用https://www.sphinx-doc.org从您的文档字符串生成漂亮的文档。

您还可以使用Python的内置help()函数来读取您在编写代码时编写的文档字符串。