파 이 썬 이 왜 디자인 모드 를 사용 하지 않 는 지 자세히 알 아 보 세 요.

머리말
방금 EuroPython 2017 강연 을 봤 는데 Why You Don't Need Design Patterns in Python,왜 python 은 디자인 모드 를 사용 하지 않 습 니까?강연 자 는 STXNEXT 의 Sebastian Buczynski 이다.
그 가 디자인 모델 에 대한 정 의 는:
4.567917.흔히 볼 수 있 는 문제 의 통용 재 활용 솔 루 션정형 화 된 가장 좋 은 실천그 는 디자인 모델 은 어디서 많이 본 것 처럼(Anology)대강(Outline)이 라 고 말 했다.그 는 디자인 모델 이 가 져 와 서 쓸 수 있 는 것 이 아니 라 고 생각한다.
Singleton
在这里插入图片描述
첫 번 째 는 Singleton 모드 입 니 다.Singleton 의 정 수 는 언제든지 하나의 사례 만 있 습 니 다.
'디자인 모드'에서 제 시 된 싱글 톤 코드 는?
설명:

class Singleton {
public:
	static Singleton* Instance();
protected:
	Singleton();
private:
	static Singleton* _instance;
};
실현:

Singleton* Singleton::_instance = 0;
Sebastian 은 Google 에서 Singleton 의 Python 을 찾 아 다음 코드 를 찾 았 습 니 다.
설명:

class Singleton:
	_instance = None
	def __new__(cls, *args, **kwargs):
		if not cls._instance:
			cls._instance = super().__new__(cls, *args, **kwargs)
		return cls._instance
실현:

one_instance = Singleton()
another_instance = Singleton()
one_instance is another_instance # True
Sebastian 은 C++를 그대로 베 끼 면 당연히 문 제 를 해결 할 수 있 지만 python 에 더 좋 은 해결 방안 이 있다 고 지적 했다.예 를 들 어@classmethod 를 사용 할 수 있 습 니 다.하지만 가장 좋 은 해결 방안 은 모듈 을 직접 사용 하 는 것 이다.module 자체 가 유일한 것 이기 때문에 module 이 singleton 을 실현 한 것 과 같 습 니 다.그러면 우 리 는 왜 많은 노력 을 들 여 singleton 을 만들어 야 합 니까?
나 는 싱글 턴 이 가장 간단 한 디자인 모델 임 에 도 불구 하고 몇 년 동안 소 용이 없 었 던 것 을 회상 했다.예전 에 C\#를 쓸 때 저 는 정적 류 를 사 용 했 습 니 다.정적 류 자체 가 유일한 것 이기 때문에 singleton 이 필요 없습니다.물론 C++와 같은 Singleton 을 쓴 사람 도 있 지만 문 제 를 해결 하면 된다 고 생각 합 니 다.디자인 모델 을 쓰기 위해 디자인 모델 을 쓸 필요 가 없습니다.마찬가지 로 VB.net 를 쓸 때 내 가 직접 사용 하 는 module 도 singleton 이 필요 없다.
결론:그 당시 의 싱글 톤 모델 은 하나의 사례 만 있 기 위해 서 였 다.python,c\#,vb.net 과 같은 프로 그래 밍 언어 자체 가 이러한 능력 을 제공 했다 면 C++의 방식 을 사용 할 필요 가 없습니다.아니면 디자인 모델 은 필요 없다.
Facade
在这里插入图片描述
在这里插入图片描述
(상기 사진 은 참고[1])
페 이 세 이 드 의 기본 개념 은 서브 시스템 이 페 이 세 이 드 로 내부 의 복잡 한 실현 을 차단 한 다 는 것 이다.
이 때,우 리 는 하위 시스템 의 python 파일 을 하나의 폴 더 에 통일 적 으로 넣 은 다음,이 폴 더 에 를 넣 을 수 있다init__.py 파일.
在这里插入图片描述
Command
command 모드 에서 요청 을 대상 으로 봉인 합 니 다.
Sebastian 은 python 에서 함수 가 1 등 시민 이기 때문에 대상 을 만 들 필요 가 없다 고 생각 합 니 다.

def command(discount_rate):
some_obj.notify_users_about_discount()
funtools 로 command 를 만 들 수도 있 습 니 다.

import functools
command = functools.partial(
some_obj.notify_users_about_discount, discount_rate=0.5
)
command()
# equals to
some_obj.notify_users_about_discount(discount_rate=0.5)
Visitor
Python 에는 인터페이스 가 없어 서 다시 불 러 올 방법 이 없습니다.그럼 Visitor 는 어떻게 실현 하나 요?
Sebastian 은@Single Dispatch 를 사용 할 수 있다 고 지적 했다.

from functools import singledispatch
@singledispatch
def visit(node):
	type_name = type(node).__name__
	raise AttributeError(f'No handler found for {type_name}')

from ast_nodes import Assign, FunctionDef
@visit.register(Assign)
def visit(node):
	pass
@visit.register(FunctionDef)
def visit(node):
	pass
우 리 는 이곳 의 실현 이 클 라 스 가 없다 는 것 을 보 았 다.
Decorator
Decorator 는 대상 을 확장 하 는 데 사용 할 수 있 습 니 다.
그것 이 실현 하 는 방법 은 새로운 종 류 를 만 드 는 것 이다.이 종 류 는 원래 의 종류 와 같은 인터페이스 에 속한다.그리고 이 종 류 는 원래 의 대상 을 받 아들 이 고 모든 방법 은 원래 의 방법 을 사용한다.
만약 c++의 을 사용한다 면,우 리 는

class OriginalClass:
	def get_text(self):
		pass
	def get_number(self):
		pass

    
class Decorator:
	def __init__(self, decorated_obj):
		self.decorated_obj = decorated_obj
	def get_text(self):
		return f'<b>{self.decorated_obj.get_text()}</b>'
	def get_number(self):
		return self.decorated_obj.get_number()
하지만 여 기 는 python 의 로getattr__특성 을 간소화 하여 실현 하 다.

class Decorator:
	def __init__(self, decorated_obj):
		self.decorated_obj = decorated_obj
	def get_text(self):
		return f'{self.decorated_obj.get_text()}'
	def __getattr__(self, attr_name):
		return getattr(self.decorated_obj, attr_name)
총결산
Sebastian 은 python 이 매우 유연 하 다 고 지적 했다.25 년 전 C++와 는 크게 다르다.논리 에 쉽게 삽입 되 는 곳 이 많다.과거의 디자인 모델 은 아마 적용 되 지 않 을 것 이다.우 리 는 python 을 잘 이해 하고 다른 언어 를 참고 해 야 한다.
나 는 아무리 좋 은 것 이라도 실제 와 결합 해 야 한다 고 생각한다.어떠한 실제 와 동 떨 어 진 방법 도 모두 불필요 하고 심지어 해롭다.모든 이론,방법의 형성 은 그 당시 의 역사 배경,기술 배경 이 있다.배후 의 메커니즘 을 모 르 고 배후 의 정신과 목적 을 모 르 고 수법 자체 에 집중 하면 점점 경직 될 수 밖 에 없다.버 티 는 것 같 지만 사실은 배신 이다.고집 은 원래 의 방식 을 고집 하 는 것 이 고,배신 은 초심 을 배반 하 는 것 을 말한다.
레 퍼 런 스
[1] Why You Don't Need Design Patterns in Python
[2] Design Patterns C Elements of Reusable Object-Oriented Software
파 이 썬 이 왜 디자인 모델 을 사용 하지 않 는 지 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 파 이 썬 디자인 모델 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기