언어/파이썬 & 장고
-
[Python] Tip - 믹스인 유틸리티 클래스에만 다중 상속을 사용언어/파이썬 & 장고 2016. 10. 26. 21:00
파이썬은 다중 상속을 다루기 쉽게 하는 기능을 내장한 객체지향 언어입니다. 다중 상속으로 얻는 편리함과 캡슐화가 필요하다면 대신 믹스인(mix-in)을 작성하는 방안을 고려해야 합니다. 믹스인이란 클래스에서 제공해야 하는 추가적인 메서드만 정의하는 작은 클래스를 말합니다. 믹스인 클래스는 자체의 인스턴스 속성(attribute)를 정의하지 않으며 __init__ 생성자를 호출하도록 요구하지 않습니다.Mix-In 상세 설명 파이썬에서의 믹스인은믹스 인은 특별한 종류의 다중 상속입니다. 믹스인이 사용되는 두 가지 주요 상황이 있습니다.한 클래스에 대해 많은 선택 기능을 제공할 때# 많은 다른 클래스에서 하나의 특정 기능을 사용하려고합니다. class HasMethod1(object): def method(s..
-
[Python] Tip - 거대한 (대용량) 데이터를 함수로 처리할 때 고려할 점언어/파이썬 & 장고 2016. 10. 25. 14:16
만약 리스트나 딕셔너리와 같은 컨테이너 타입에 10만, 100만 혹은 1억 이상의 데이터가 들어있다고 가정합니다. 이 부분자체에서 이미 엄청난 메모리를 소비합니다. 이러한 거대한 값이 들어있는 변수를 함수의 인수로 전달한다고 하면 어떤지 알아보겠습니다. 먼저 맨 처음 생각 한 것이 이 거대한 값이 들어있는 변수에 대한 메모리 주소공간을 전달하는 것이 아닌 값 자체를 전부 전달한다고 생각했습니다. 그래서 아래와 같이 생각을 해봤습니다.컨테이너 변수를 global 변수로 선언먼저 파이썬에는 글로벌 변수라는 것이 없습니다. (이 말은 모든 모듈을 자동적으로 사용할 수 있습니다.) 만약 있다 해도 글로벌 변수로 해당 데이터를 잡아버리면 프로그램이 죽을 때까지 거대한 메모리를 계속해서 잡고 있기 때문에 글로벌변수..
-
[Python] Tip - super()로 부모클래스를 초기화언어/파이썬 & 장고 2016. 10. 22. 22:27
super를 사용하지 않고 자식클래스에서 부모클래스를 초기화 할 때 다음과 같은 방법을 사용합니다.class Parent: def __init__(self,num): print('parent', num) class Child(Parent):ㄷ def __init__(self): Parent.__init__(5) 클래스가 다중상속을 받는다면 (보통 피해야되지만) 예기치 못한 동작을 일으킵니다.class Parent: def __init__(self, value): self.value = value class Parent1: def __init__(self): self.value *= 2 class Parent2: def __init__(self): self.value += 5 class Child(Pare..
-
[Python] Tip - 객체를 범용으로 생성하려면 @classmethod 다형성을 사용언어/파이썬 & 장고 2016. 10. 22. 20:18
파이썬에서는 객체가 다형성을 지원할 뿐만 아니라 클래스도 다형성을 지원합니다. 다형성은 계층 구조에 속한 여러 클래스가 자체의 메서드를 독립적인 버전으로 구현하는 방식입니다. 다형성을 이용하면 여러 클래스가 같은 인터페이스나 추상 기반 클래스를 충족하면서도 다른 기능을 제공할 수 있습니다.예를 들어 맵리듀스 구현을 작성할 때 입력 데이터를 표현할 공통 클래스가 필요하다고 가정합니다. 다음은 서브클래스에서 정의해야 하는 read메서드가 있는 입력 데이터 클래스입니다.class InputData: def read(self): raise NotImplementedError class PathInputData(InputData): """ 디스크에 있는 파일에서 데이터를 읽어오는 InputData의 서브클래스 "..
-
[Python] Tip - 인터페이스가 간단하면 클래스 대신 함수언어/파이썬 & 장고 2016. 10. 22. 19:21
파이썬 내장 API의 상당수는 함수를 넘겨서 동작을 사용자화하는 기능이 있습니다. API는 이런 후크(hook)를 이용해서 사용자가 작성한 코드를 실행 중에 호출합니다. 다음 예제는 list 타입의 sort 메서드는 정렬에 필요한 각 인덱스의 값을 결정하는 선택적인 key 인수를 받습니다. lambda 표현식을 key 후크로 넘겨서 이름 리스트를 길이로 정렬합니다.names = ['aocrates', 'archimedes', 'plato', 'aristotle'] names.sort(key=lambda x: len(x)) print(names) # 결과 # ['plato', 'aocrates', 'aristotle', 'archimedes'] 다른 언어에서라면 후크를 추상 클래스로 정의할 것이라고 예상할..
-
[Python] Tip - 딕셔너리와 튜플보다는 헬퍼 클래스로 관리언어/파이썬 & 장고 2016. 10. 21. 21:40
파이썬에 내장되어 있는 딕셔너리 타입은 객체의 수명이 지속되는 동안 동적인 내부 상태를 관리하는 용도로 좋습니다. 여기서 '동적'이란 예상하지 못한 식별자들을 관리해야 하는 상황을 뜻합니다. 예를 들어 이름을 모르는 학생 집단의 성적을 기록하고 싶다고 할 때, 학생 별로 미리 정의된 속성을 사용하지 않고 딕셔너리에 이름을 저장하는 클래스를 정의할 수 있습니다.class SimpleGradebook: def __init__(self): self._grades = {} def add_student(self, name): self._grades[name] = [] def report_grade(self, name, score): self._grades[name].append(score) def average_..
-
[Python] Tip - 키워드 전용 인수로 명료성을 강요언어/파이썬 & 장고 2016. 10. 21. 21:00
함수에서 파라미터를 정의하고 아규먼트로 값을 넘겨줄 때 키워드 인수 사용을 강요하는 것이 함수사용에 있어 혼란을 줄일 수 있습니다.인수 리스트에 있는 *기호는 위치 인수의 끝과 키워드 전용 인수의 시작을 가리킵니다.def division(number, divisor, *, ignore_overflow=False, ignore_zero_division=False): # ... division(1,0,0) # 에러 division(1,0,ignore_overflow=True) # * 다음의 키워드를 명시해야 함요약키워드 인수는 함수 호출의 의도를 더 명확하게 해줌특히 부울 플래그를 여러 개 받는 함수처럼 헷갈리기 쉬운 함수를 호출할 때, 키워드 인수를 넘기게 하려면 키워드 전용 인수를 사용파이썬 3은 함수의..
-
[Python] Tip - 동적 기본 인수를 지정하려면 None과 docstring을 사용언어/파이썬 & 장고 2016. 10. 21. 20:54
키워드 인수의 기본값으로 비정적(non-static)타입을 사용해야 할 때도 있습니다.예를 들어 이벤트 발생 시각까지 포함해 로깅 메시지를 출력한다고 가정합니다. 보통 함수를 호출한 시각을 메시지에 포함하여 다음과 같이 처리합니다.import datetime import time def log(message, when=datetime.datetime.now()): print('%s: %s' % (when, message)) log('hi there') time.sleep(0.1) log('hi again') # 결과 # 2016-10-21 20:40:07.689163: hi there # 2016-10-21 20:40:07.689163: hi againdatetime.datetime.now()는 함수를 ..