python设计模式


166

我正在寻找使用Python给出最佳实践,设计模式和SOLID原理示例的任何资源。



Answers:


152

这些重叠

Python中级和高级软件木工

像Pythonista一样的代码:惯用的Python

Python成语与效率

Google美国开发人员日-Python设计模式

另一个资源是Python食谱中的示例。很多人没有遵循最佳实践,但是您可以在其中找到一些有用的模式


1
第三个链接已死。试图找到镜子,但找不到,如果有人有正确的链接,请添加
formatkaka

1
同样,Python成语和效率似乎无效。
戴维

第一个和第二个链接已失效,因此我使用Internet存档快照对其进行了更新。尽管我相信很多东西仍然有用,但它们似乎已经很老了。
mannykary

24

类型

>>> import this

在Python控制台中。

尽管这通常被当作一个笑话,但它包含几个有效的特定于Python的公理。



6

您可以在这里这里开始。

要更深入地了解设计模式,您应该查看设计模式:可重用的面向对象软件的元素。源代码不是Python中的代码,但是不需要您了解这些模式。


8
我认为了解如何使用惯用python来实现设计模式非常重要。它与GOF中使用的C ++语言完全不同,因此从C ++移植到python将导致非Python代码。
sakisk 2011年

1
我倾向于不同意。单例DP或其他DP都可以使用任何OO语言编写,无论是Python,Java还是C ++。您认为非Python语言是什么?
Paul Hiemstra '02

1
第一个链接是一篇相当糟糕的论文,其中有许多关于Python的错误断言。我想,第二个目前的404造成的伤害要少得多:)
布兰登·罗兹

6

在调用可能存在或不存在的对象的属性时,可以用来简化代码的方法是使用Null对象设计模式(在Python Cookbook中引入了Null对象设计模式)。

大致来说,使用Null对象的目标是为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("any", "params", "you", "want").attribute_that_doesnt_exists()它就不会爆炸,而只是默默地变成了pass

通常你会做类似的事情

if obj.attr:
    obj.attr()

这样,您只需执行以下操作:

obj.attr()

忘掉它 注意该Null对象的广泛使用可能会在代码中隐藏错误。


3

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

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


1
问题是关于Python的。这篇论文谈论的是类似于Scheme的语言,据我所知,它是针对该特定论文在现场发明的。除非发问者是(a)具有(b)长期Python实践经验的学术计算机科学家,否则我怀疑他们是否可以从论文中获得任何有价值的东西-更重要的是,他们可能不会问这个问题首先。:)
布兰登·罗兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.