Python设计模式

169

我正在寻找任何资源,提供使用Python展示最佳实践、设计模式和SOLID原则的示例。


重复:https://dev59.com/40XRa4cB1Zd3GeqPqUm4,https://dev59.com/SnRB5IYBdhLWcg3wtJGF,http://stackoverflow.com/questions/112358/what-are-some-good-web-resources-for-learning-object-oriented-programming - S.Lott
https://github.com/faif/python-patterns/blob/master/README.md - Kamesh Jungi
6个回答

153

1
第三个链接已经失效。尝试寻找镜像但未能成功,如果有人有正确的链接,请添加。 - formatkaka
1
同样的问题,_Python惯用语和效率_似乎不起作用。 - Dawid Laszuk
第一和第二个链接已经失效,所以我用互联网档案库的快照更新了它们。虽然它们看起来很陈旧,但我相信其中很多仍然相关。 - mannykary

25

类型

>>> import this

在Python控制台中。

虽然这通常被视为(好笑!)玩笑,但它包含了一些有效的特定于Python的公理。


13

2
请注意,根据维基百科的说法,这本书已不再维护。 - sakisk
更新链接 [Python 编程思想] (http://www.mindview.net/Books/Python/ThinkingInPython.html)。 - surge10

6
您可以使用空对象设计模式来简化在调用存在或不存在的对象属性时的代码。您可以在Python Cookbook中了解到这种模式。

空对象的目标大致是为在Python中使用基本数据类型None或者在其他语言中使用Null(或Null指针)提供“智能”的替代品。它们有许多用途,包括一个除特殊元素之外的一组其他类似元素的成员。通常,这会导致条件语句以区分普通元素和基本Null值。

这个对象只是消去了缺少属性错误,您可以避免检查它们的存在性。

这不过就是:

class Null(object):

    def __init__(self, *args, **kwargs):
        "Ignore parameters."
        return None

    def __call__(self, *args, **kwargs):
        "Ignore method calls."
        return self

    def __getattr__(self, mname):
        "Ignore attribute requests."
        return self

    def __setattr__(self, name, value):
        "Ignore attribute setting."
        return self

    def __delattr__(self, name):
        "Ignore deleting attributes."
        return self

    def __repr__(self):
        "Return a string representation."
        return "<Null>"

    def __str__(self):
        "Convert to a string and return it."
        return "Null"

如果你使用Null("任何", "参数", "你","想要").attribute_that_doesnt_exists(),它就不会抛出异常错误,而是无声地变成了等同于pass的状态。

通常,你会做类似以下的操作:

if obj.attr:
    obj.attr()

通过这个,你只需要执行以下操作:

obj.attr()

并且忘记它。请注意,广泛使用Null对象可能会潜在地隐藏您代码中的错误。


6

8
我认为理解如何使用习惯用语的 Python 实现设计模式很重要。Python 是一种与 GOF 中使用的 C++ 很不同的语言,因此从 C++ 移植到 Python 将导致非 Python 风格的代码。 - sakisk
1
我倾向于不同意。无论是Python、Java还是C++,任何面向对象的语言都可以实现单例DP或其他DP。在你看来,什么是非Pythonic的呢? - Paul Hiemstra
1
第一个链接是一篇相当糟糕的论文,关于Python有许多错误的声明。第二个链接目前404错误,因此,我认为对它的影响要小得多 :) - Brandon Rhodes

3

您可能还希望阅读这篇文章(选择.pdf文件),其中讨论了动态面向对象语言(即Python)中的设计模式。引用该页面的话:

本文探讨了在使用动态、高阶、面向对象编程语言解决类似问题时,“四人帮”或“GOF”书中的模式如何出现。一些模式消失了——也就是说,它们直接由语言特性支持,有些模式更简单或具有不同的重点,而有些则基本上没有改变。


1
问题是关于Python的;这篇论文讨论了一种类似Scheme语言的东西,据我所知,是为了这篇特定的论文而发明的。除非提问者是(a)具有(b)长期的Python实践经验的学术计算机科学家,否则我怀疑他们是否能从这篇论文中得到任何有价值的东西 - 更重要的是,他们可能根本就不会首先提出这个问题。 :) - Brandon Rhodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接