파이썬 디자인 패턴


166

Python을 사용하여 모범 사례, 디자인 패턴 및 SOLID 원칙의 예를 제공하는 리소스를 찾고 있습니다.



답변:


152

이 중 일부는 겹칩니다

Python의 중급 및 고급 소프트웨어 목공

Pythonista와 같은 코드 : 관용적 파이썬

파이썬 숙어와 효율성

미국 Google 개발자의 날-Python 디자인 패턴

또 다른 리소스는 Python Recipes에 있습니다. 좋은 숫자는 모범 사례를 따르지 않지만 유용한 패턴이 있습니다.


1
세 번째 링크는 죽었습니다. 거울을 찾으려고했지만 찾지 못했습니다. 정확한 링크가있는 사람이 있다면 추가하십시오
formatkaka

1
여기서도 파이썬 관용구와 효율성 이 작동하지 않는 것 같습니다.
Dawid Laszuk

첫 번째와 두 번째 링크가 작동하지 않아 인터넷 아카이브 스냅 샷으로 업데이트했습니다. 비록 그것이 여전히 관련이 있다고 확신하지만, 그들은 매우 오래된 것 같습니다.
mannykary

24

유형

>>> import this

파이썬 콘솔에서.

이것은 일반적으로 (괜찮아!) 농담으로 취급되지만 몇 가지 유효한 파이썬 관련 공리를 포함합니다.



6

여기여기에서 시작할 수 있습니다 .

디자인 패턴 에 대해 자세히 살펴 보려면 디자인 패턴 : 재사용 가능한 객체 지향 소프트웨어의 요소를 살펴보십시오 . 소스 코드는 Python이 아니지만 패턴을 이해할 필요는 없습니다.


8
디자인 패턴을 구현하기 위해 관용적 파이썬을 사용하는 방법을 이해하는 것이 중요하다고 생각합니다. GOF에서 사용되는 C ++과는 매우 다른 언어이므로 C ++에서 Python으로 포팅하면 비 파이썬 코드가 생성됩니다.
사키 스크

1
나는 동의하지 않는 경향이있다. 싱글 톤 DP 또는 다른 DP는 Python, Java 또는 C ++ 등 모든 OO 언어로 가능합니다. 귀하의 의견에 비피 토닉이란 무엇입니까?
Paul Hiemstra

1
첫 번째 링크는 파이썬에 대한 많은 잘못된 주장과 함께 상당히 가난한 논문입니다. 두 번째로 현재 404는 따라서 훨씬 적은 피해를 입힌다고 생각합니다 :)
Brandon Rhodes

6

존재하거나 존재하지 않을 수있는 객체에서 속성을 호출 할 때 코드를 단순화하기 위해 사용할 수있는 것은 Null 객체 디자인 패턴 ( Python Cookbook 에서 소개 된 )을 사용하는 것입니다.

대략 Null 객체의 목표는 Python에서 자주 사용되는 기본 데이터 형식 None 또는 다른 언어의 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

동적 객체 지향 언어 (예 : Python)의 디자인 패턴에 대해 설명하는 이 기사 (.pdf 파일 선택) 를 읽을 수도 있습니다 . 페이지를 인용하려면 :

이 백서에서는 "Gang of Four"또는 "GOF"책의 패턴이 동적, 고차, 객체 지향 프로그래밍 언어를 사용하여 유사한 문제를 해결할 때 나타나는 방식을 살펴 봅니다. 일부 패턴은 사라집니다. 즉 언어 기능에 의해 직접 지원되고 일부 패턴은 더 단순하거나 다른 초점을 가지며 일부는 본질적으로 변경되지 않습니다.


1
문제는 파이썬에 관한 것이었다. 이 논문은 내가 말할 수있는 방식 으로이 특정 논문을 위해 즉석에서 발명 된 계획과 같은 언어에 대해 이야기합니다. 질문자가 (a) 파이썬 관행에 대한 오랜 경험을 가진 학계 컴퓨터 과학자가 아니라면, 그들이 종이에서 가치가있는 것을 얻을 수 있을지 의심 스럽습니다. 처음에. :)
Brandon Rhodes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.