아카이브는 사용자가 등록한 "팁 또는 강좌"와 같은 유용한 정보들을 제공하는 것을 목적으로 합니다.

어떠한 정보라도 괜찮습니다. 알고 있는 정보나 학습하면서 배운 내용들을 작성해 주세요.

Borg Pattern(보그 패턴)

디자인 패턴 중 보그(borg) 패턴에 대해 알아보자.기본개념보그 패턴은 monostate pattern이라고도 불린다. 싱글턴 패턴과 매우 유사하지만 싱글턴 패턴은 하나의 인스턴스만 갖는 대신에보그 패턴은 여러개의 인스턴스에서 하나의 상태(state)를 공유한다는게 차이점이다. 즉, 하나의 인스턴스를 공유하는게 아니고 하나의 상태(state)를 공유하는 것이다. 구현구현은 파이썬 언어로 작성되었다.class Borg: _shared_state = {}  def __init__(self): self.__dict__ = self._shared_state  a = Borg()b = Borg() print(a is b) # Falsea.site = 'dolgonet'print(b.site) # dolgonet일반적으로 파이썬의 인스턴스에는 __dict__이라는 속성이 있고,  모든 인스턴스에는 자신만의 __dict__을 가지고 있다.코드에서는 의도적으로 __dict__에 클래스 변수인 _shared_state를 할당하고, 이렇게 함으로써 모든 인스턴스는 하나의 상태(state)를 공유하게 되는 것이다.참고자료- Python Design Pattern

코닝구 2018.10.09 18:02:36
Singleton Pattern(싱글턴 패턴)

디자인 패턴중에서 싱글턴(Singleton) 패턴에 대해서 알아보자.기본 개념싱글턴 패턴은 오래전부터  많이 알려지고 사용된 디자인 패턴중에 하나로하나의 클래스에 인스턴스를 하나만 만들어야하는 경우 사용되는 패턴이다.최초 생성 이후에 호출되는 생성자는 최초 인스턴스를 리턴한다.싱글턴은 다음과 같은 상황에 사용된다.공유자원(shared resource)에 대한 동시접근(concorrenct access)을 제어할 필요가 있는 경우.여러 시스템에서 하나의 자원에 접근하는 지점이 필요한 경우.유일객체(unique object)가 필요한 경우.일반적으로 싱글턴이 사용되는 예는 다음과 같다.logging class.print spooler.DBCP(Dabasebase Connection Pool).File Manager.전역 상태를 담고 있는 읽기 전용 싱글턴.구현구현은 파이썬 언어로 작성하였다. class Singleton: def __new__(cls, *args, **kwargs): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance a = Singleton()b = Singleton()print(a) #<__main__.Singleton object at 0x10d4d5278>print(b) #<__main__.Singleton object at 0x10d4d5278>같은 객체임을 알 수 있다. 아래는 위키피디아에서 작성되어 있는 예제 코드이다.class Singleton(type): def __init__(cls, name, bases, dict): super(Singleton, cls).__init__(name, bases, dict) cls.instance = None  def __call__(cls, *args, **kw): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args, **kw) return cls.instance class MyClass(object): __metaclass__ = Singleton print MyClass()print MyClass()Descorator 사용def singleton(cls): instance = [] def getinstance(): if not len(instance): instance.append(cls()) return instance[0] return getinstance @singletonclass MyClass: ...참고 자료- Python Design Patterns- wikipedia

코닝구 2018.10.07 17:24:30
Decorator Pattern(데코레이터 패턴)

파이썬의 디자인 패턴 중에서 데코레이터(Decorator) 에 대해서 알아보자. 기본 개념데코레이터 패턴은 어떤 한 객체에 기존 동작은 변경하지 않고 새로운 기능을 다이나믹하게 장식해 주는 것을 말한다.그리고 추가한 새로운 기능이 모든 서브 클래스에 영향을 끼치는 것이 아니고 특정 객체에만 끼친다.간단한 예제 코드를 통해 다시 살펴보자. 아래 예제는 카페 모카에 샷과 휘핑을 추가한 코드이다.class Order:    def __init__(self, name):        self._name = name     def cost(self):        return 4000  class Shot(Order):    def __init__(self, coffee):        self._coffee = coffee      def cost(self):        return self._coffee.cost() + 500  class Whip(Order):    def __init__(self, coffee):        self._coffee = coffee     def cost(self):        return self._coffee.cost() + 200  if __name__ == '__main__':    o1 = Order('Mocha')    o2 = Whip(Shot(o1)) # [1]     print(o1.cost())  # 4000    print(o2.cost())  # 4700 코드를 해석하면 Order 클래스는 Shot, Whip의 Base 클래스인 슈퍼 클래스이고 name을 아규먼트로 받아서 self.name에 대입하여 생성하고 cost 메소드는 기본 가격인 4000을 반환한다.Shot 클래스는 Order 클래스를 계승하고 Order를 참조 할 수 있는 coffee를 아규먼트로 받아 인스턴스 변수인 self._coffee에 대입한다. cost 메소드는 self._coffee.cost()를 호출하여 반환된 4000에 500을 더한다. Whip 클래스도 Shot 클래스와 동일하다. 최종적으로 4700이 출력된다.# [1] =  차례대로 전달된다. Shot(), Whip() 순으로 전달된다.그래프를 보면 Order는 개별적으로 사용될 수 있고 하나 또는 여러 개의 데코레이터로 래핑되는 걸 알 수 있다.장점데코레이터 패턴을 사용하면 런타임시에 특정 객체에 대해서만 새로운 기능을 확장할 수 있다.서브클래스의 대안이다. 서브클래스는 컴파일시에 기능이 추가되고 클래스의 모든 인스턴스에 영향을 주지만 데코레이터 패턴은 런타임시특정 객체에 대해서만 기능을 확장 할 수 있다.단점데코레이터 패턴을 많이 사용하거나 여러개의 데코레이터로 래핑하게 되면 복잡해진다.데코레이터 패턴으로 새로운 기능이 확장될수록 가독성이 떨어진다.사용 시기모든 서브 클래스에 영향을 주지 않고 특정 객체에만 기능을 확장하고 싶은 경우OCP데코레이터 패턴은 객체지향 5대 원리 중 하나인 OCP(Open/Close Principle)에 해당한다. 버틀란트 메이어(Bertrand Meyer)박사가 1998년 객체지향 소프트웨어 설계 라는 책에서 정의한 내용으로 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원리입니다. 이것은 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화 해야 한다는 의미로, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다는 뜻입니다. 로버트 C. 마틴은 OCP는 관리가능하고 재사용 가능한 코드를 만드는 기반이며, OCP를 가능케 하는 중요 메커니즘은 추상화와 다형성이라고 설명하고 있습니다. OCP는 객체지향의 장점을 극대화하는 아주 중요한 원리라 할 수 있습니다.출처: http://www.nextree.co.kr/p6960/참고 자료http://www.geeksforgeeks.org/the-decorator-pattern-set-2-introduction-and-design/

코닝구 2017.10.31 01:05:21
Tuples - 튜플 자료형

튜플은 리스트와 마찬가지로  sequence 자료형이며 리스트와 매우 유사하지만 원소의 삭제, 수정 등 변경이 불가능하다. 그러므로 튜플은 상수에 사용하기 적합하다. 리스트와 마찬가지로 원소마다 index가 0부터 순차적으로 할당되며 index를 통해 원소에 접근할 수 있다. 튜플은 일반적으로 ()로 선언한다. 튜플 선언시 주의할 점으로는 원소가 하나인 경우 마지막에 콤마(,)를 입력해 주어야 튜플로 선언된다는 것이다.다음은 다양하게 선언한 튜플 예제이다.tup0 = ()tup1 = ('one','two', 'three')tup2 = 'one', 'two', 'three',tup3 = tuple([1,2])tup4 = ('one','two', 'three', ('for', 'five'))tup5 = ('one',)tup6 = 'one',튜플은 리스트와 마찬가지로 원소가 없거나, 튜플 안에 튜플을 가질 수도 있다. 또한, 여러가지 타입의 자료형을 원소로 가질 수 있다.원소에 접근하려면 리스트와 동일하게 대괄호([]) 안에 index를 입력하면 된다. 음수 index로 접근이 가능하고 일정 범위만큼 자르는 슬라이스도 가능하다.tup = ('one', 'two', 'three', 4, 5)print("tup[0] : ", tup[0])  # tup[0] :  oneprint("tup[0:2] : ", tup[0:2])  # tup[0:2] :  ('one', 'two')print("tup[:2] : ", tup[:2])  # tup[:2] :  ('one', 'two')print("tup[2:] : ", tup[2:])  # tup[2:] :  ('three', 4, 5)새로운 변수에 튜플을 대입한 경우 리스트와 마찬가지로 사용된 메모리에 두개의 변수가 참조한다.tup = ('one', 'two', 'three', 4, 5)tup1 = tupprint(hex(id(tup1)))  # 0x3ccc5cprint(hex(id(tup)))  # 0x3ccc5c튜플의 앞서 말하였듯이 원소의 값을 변경하거 삭제 할 수 없다. 다시 말하면 리스트의 index를 변경할 수 있는 메소드인 append(),pop(), remove() 등은 존재하지 않지만 두 튜플을 연결하는 + 연산자와 반복하는 * 연산자는 존재한다.tup = ('one', 'two', 'three', 4, 5)tup1 = tup + (6, 7)tup2 = tup + (6,)tup3 = tup * 2print("tup1 : ", tup1)  # tup1 :  ('one', 'two', 'three', 4, 5, 6, 7)print("tup2 : ", tup2)  # tup2 :  ('one', 'two', 'three', 4, 5, 6)print("tup3 : ", tup3)  # tup3 :  ('one', 'two', 'three', 4, 5, 'one', 'two', 'three', 4, 5)내장함수함수설명cmp() 두 튜플을 비교한다.syntaxcmp(tuple1, tuple2)* python3 이상 부터는 더 이상 cmp 함수를 지원하지 않는다. cmp를 사용해야 하는 경우라면 아래와 같이 함수로 정의해서 사용 할 수 있다.def cmp(a, b):    return (a > b) - (a < b) len()튜플의 원소 수를 반환한다.syntaxlen(tuple)exampletup1, tup2 = ('one', 'two'), ('three', 'four',5)print("tup1 : ", len(tup1))  # tup1 : 2print("tup2 : ", len(tup2))  # tup1 : 3 max()튜플의 원소 중 최대 값을 반환한다. python2,3 에서  max() 함수의 가장 큰 차이점은 python2에선 원소의 자료형이 달라도 사용 가능했지만 python3에서는 같은 자료형에 대해서만 사용 가능하고 자료형이 같지 않으면 typeError가 난다.syntaxmax(tuple)exampletup1, tup2 = ('one', 'two'), ('three', 'four',5)print("tup1 : ", max(tup1))  # tup1 : twoprint("tup2 : ", max(tup2))  # errormin()튜플의 원소중 최소값을 반환한다. python2, 3 의 차이점은 max() 함수와 동일하다.syntaxmin(tuple)exampletup1, tup2 = ('one', 'two'), ('three', 'four',5)print("tup1 : ", min(tup1))  # tup1 : oneprint("tup2 : ", min(tup2))  # error tuple()tuple()는 시퀀스 자료형을 인수로 받아 새로운 튜플로 변환하여 대입한다. tuple()은 리스트를 튜플로 변환할때 사용한다.syntaxtuple(seq)examplelist1 = ['one', 'two', 'three', 4, 5]tuple1 = tuple(list1)print("tuple : ", tuple1)  # tuple :  ('one', 'two', 'three', 4, 5) 

John.cho 2016.07.11 00:06:11
List - 리스트 자료형

리스트는 파이썬의 sequence 자료형 중 가장 많이 사용되는 대표적인 자료 구조다.  각각의 값들은 요소 또는 원소라 부르며 콤마(,)로 구분한다.원소마다 index가  0부터 순차적으로 할당되며 index를 통해 원소에 접근할 수 있다. 리스트는 일반적으로 대괄호([ ])로 선언하며 list()로도 선언 할 수 있다.다음은 다양하게 선언한 예제이다.list0 = []list1 = ['one', 'two', 3, 4, 5]list2 = [1, 2, 3, 4, 5]list3 = ['one', 'two', 'three', 'four', 'five']list4 = ['one', 'two', ['three', 'four']]list5 = list(range(100)) print(type(list0)) # 리스트는 list0 처럼 원소가 없거나 list1처럼 문자열과 숫자를 원소로 가질 수 있으며, 리스트안에 리스트를 가질 수 있다. 즉 Java나 C언어의 배열은 동일한 타입의 자료형만 원소로 가질 수 있지만 list는 여러가지 타입의 자료형을 원소로 가질 수 있다. 그러므로 배열과 리스트는 엄밀히 따지면 다르다.원소에 접근하려면 대괄호([])안에 index를 입력하면 된다. 또한 음수 index로의 접근이 가능하고 일정 범위만큼 잘라 출력 할 수 있다. 이를 슬라이스(slice)라 한다.print("list1[0] : ", list1[0])  # list1[0] :  oneprint(list1[2])  # 3print(list1[1:5])  # ['two', 3, 4, 5]print(list1[-1]) # 5새로운 변수에 기존 변수를 대입한 경우 두 변수는 리스트 하나에 사용된 메모리를 참조한다. 즉, 새로운 메모리로 리스트를 할당하는게 아는게 아닌 두개의 변수가 메모리 하나를 참조하는 것이다.list6 = list1print(hex(id(list1))) # 0x188e20cprint(hex(id(list6))) # 0x188e20c파이썬에선 리스트를 쉽게 생성하기 위해 list comprehension를 제공한다. 가령, 0부터 9까지 제곱된 수의 리스트를 생성한다고 하였을 경우 다음과  같은 방법이 있다.square = []for x in range(10):    square.append(x**2) print(square)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]list comprehension를 사용하면 간결하게 위와 동일한 리스트를 생성 할 수 있다.squares = [x**2 for x in range(10)]print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]처리속도에서도 차이가 발생했다. 프로파일러로는 cProfile를 사용하였으며 0부터 9999999의 수를 가지는 리스트의 모든 원소들을 제곱하여 처리 속도를 비교하였다.def square(list):    ~~~~ list = list(range(10000000))square(list)return [i * i for i in list]1.049return [i ** 2 for i in list]1.282return map(lambda i: i ** 2, list)3.569ret = []for i in list:    ret.append(i ** 2)return ret3.133list comprehension로 리스트를 생성한 것이 append로 생성하는 것보다 처리 속도가 빠른걸 알 수 있다.. list comprehension에 대해 더  자세한 사항은 공식 문서를 참고하길 바란다.내장함수함수설명len()        리스트의 원소 수를 반환한다.   syntax    len(list)   examplelist1, list2, list3 = [1, 2, 3, 4, 5], [1, 'two'], ['one', ['two', 3]]print("list1 : ", len(list1))  # list1 : 5print("list2 : ", len(list2))  # list2 : 2print("list3 : ", len(list2))  # list3 : 2max()    리스트 원소 중 최대 값을 반환한다. python2,3 에서  max() 함수의 가장 큰 차이점은 python2에선 원소의 자료형이 달라도     사용 가능했지만 python3에서는 같은 자료형에 대해서만 사용 가능하고 자료형이 같지 않으면 typeError가 난다.   syntax    max(list)   examplelist1, list2 = [1, 2, 3, 4, 5], ['one', 'two', 'three']print("list1 : ", max(list1))  # list1 : 5print("list2 : ", max(list2))  # list2 : two min()    리스트의 원소중 최소값을 반환한다. python2, 3 의 차이점은 max() 함수와 동일하다.   syntax    min(list)   examplelist1, list2 = [1, 2, 3, 4, 5], ['one', 'two', 'three']print("list1 : ", min(list1))  # list1 : 1print("list2 : ", min(list2))  # list2 : onelist()    list()는 시퀀스 자료형을 인수로 받아 새로운 리스트로 변환하여 반환한다. list()는 튜플을 리스트로 변환하는데 사용된다.   syntax    list(aTuple)   exampleaTuple = ('one', 'two', 'three')list1 = list(aTuple)print("List1 : ", list1)  # List1 :  ['one', 'two', 'three']내장 메소드메소드설명append()    전달한 객체가 리스트의 마지막 요소로 추가된다.   syntax    list.append(obj)   examplelist1 = ['one', 'two', 'three', 'four', 'five']list1.append('six')print("List1 : ", list1)  # List1 :  ['one', 'two', 'three'] count()    전달한 객체의 원소의 수를 확인한다.   syntax    list.count(obj)   examplelist1 = ['one', 'two', 'three', 'four', 'five']print("List1 : ", list1.count('one'))  # List1 :  1 extend()    리스트 객체를 전달하여 한번에 여러개의 원소를 추가한다.   syntax    list.extend(seq)   examplelist1 = ['one', 'two', 'three']list2 = ['four', 'five'];list1.extend(list2)print("List1 : ", list1)  # List1 :  ['one', 'two', 'three', 'four', 'five'] index()    원소의 위치를 확인한다. 기본적으로 가장 낮은 인덱스를 반환하며 두번째, 세번째 매개변수로 검색하는 범위를 지정 할 수       있다.   syntax    list.index(obj)   examplelist1 = ['one', 'two', 'three', 'two', 'one', 'two']print("Index : ", list1.index('two'))  # Index : 1print("Index : ", list1.index('two', 4, 6))  # Index : 5 insert()    지정한 인덱스에 원소를 추가한다. 지정한 인덱스가 리스트의 길이보다 큰 경우 마지막에 추가된다.   syntax    list.index(index, obj)   examplelist1 = ['one', 'two', 'three', 'two', 'one', 'two']list1.insert(1, 'insert1')list1.insert(100, 'insert2')print("List : ", list1) # List :  ['one', 'insert1', 'two', 'three', 'two', 'one', 'two', 'insert2'] pop()    지정한 인덱스의 원소가 반환되며 리스트에서 제거 된다. obj를 전달하지 않으면 기본적으로 마지막 원소를 반환하며, obj를     전달하면 지정한 인덱스의 원소가 제거 후 반환된다.   syntax    list.pop(obj=list[-1])   examplelist1 = ['one', 'two', 'three']list1.pop(1)print("List : ", list1) # List :  ['one', 'three'] remove()    리스트의 원소를 제거 한다. pop()과의 차이점으로는 제거만 하고 해당 원소를 반환하지 않는다.   syntax    list.remove(obj)   examplelist1 = ['one', 'two', 'three']list1.remove('one')print("List : ", list1) # List :  ['two', 'three'] reverse()    리스트의 원소를 반전시킨다.    syntax    list.reverse()   examplelist1 = ['one', 'two', 'three']list1.reverse()print("List : ", list1) # List :  ['two', 'three'] sort()    리스트의 원소를 재정렬 시킨다. python3 에서는 max() 함수와 마찬가지로 같은 자료형에서만 사용 가능하다. python3에    서의 서로 다른 자료형에 대한 정렬은 sorted 함수를 이용한 방법이 있다.   syntax    list.sort([func])   example list1 = ['one', 'two', 'three']list1.sort()print("List : ", list1) # List :  ['one', 'three', 'two']list1.sort(reverse=True)print("List : ", list1) # List :  ['two', 'three', 'one'] 

John.cho 2016.07.08 22:17:16