티스토리 뷰
0. 동적계획법(dynamic programming)
- 복잡한 문제를 재귀를 통해 간단한 하위 문제로 분류하여 단순화하여 해결하는 방법
- 어떤 문제가 최적부분구조(optimal substructure)와 중복되는 부분문제(overlapping subplot problem)을 갖고 있다면, 동적 계획법으로 해결할 수 있음
- 최적 부분 구조는 답을 구하기 위해서 했던 계산을 반복해야 한다는 문제의 구조
1. 데커레이터?
- 소스코드에 있는 함수를 '표시'해서 함수의 작동을 개선할 수 있게 해줌
- 다른 함수를 인수로 받는 콜러블(데커레이트된 함수)
- 데커레이트된 함수에 어떤 처리를 수행하고, 함수를 반환하거나 함수를 다른 함수나 콜러블 객체로 대체
- 다른 function의 기능을 조작하여 새로운 function을 만드는 것
예제1)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def decorator_function(original_function):
def wrapper_function():
return original_function()
return wrapper_function
def display():
print("display 함수가 실행됐습니다")
decorated_display = decorator_function(display)
decorated_display()
|
cs |
>>display 함수가 실행됐습니다
예제2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def decorator_function(original_function):
def wrapper_function():
print("{} 함수가 호출되기 전입니다.".format(original_function.__name__))
return original_function()
return wrapper_function
def display_1():
print("display_1 함수가 실행됐습니다.")
def display_2():
print("display_2 함수가 실행됐습니다.")
display_1 = decorator_function(display_1)
display_2 = decorator_function(display_2)
display_1()
print("")
display_2()
|
cs |
>>display_1 함수가 호출되기 전입니다.
>>display_1 함수가 실행됐습니다.
>>display_2 함수가 호출되기 전입니다.
>>display_2 함수가 실행됐습니다.
예제3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# @ 심볼 활용하기
def decorator_function(original_function):
def wrapper_function():
print("{} 함수가 호출되기 전입니다.".format(original_function.__name__))
return original_function()
return wrapper_function
@decorator_function
def display_1():
print("display_1 함수가 실행됐습니다.")
@decorator_function
def display_2():
print("display_2 함수가 실행됐습니다.")
# display_1 = decorator_function(display_1)
# display_2 = decorator_function(display_2)
display_1() # 변수에 함수형 리턴값 할당 없이 바로 함수 호출이 가능하다.
display_2() # 변수에 함수형 리턴값 할당 없이 바로 함수 호출이 가능하다.
|
cs |
>>display_1 함수가 호출되기 전입니다. 0
>>display_1 함수가 실행됐습니다.
>>display_2 함수가 호출되기 전입니다.
>>display_2 함수가 실행됐습니다.
예제4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def decorator(func):
def decorated():
print(func, "출력입니당")
return func()
return decorated
@decorator
def show_1():
print("show1")
@decorator
def show_2():
print("show2")
show_1()
show_2()
|
cs |
>>출력입니당
>>show1
>>출력입니당
>>show2
예제5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import datetime
def datetime_decorator(func):
def decorated():
print(datetime.datetime.now())
func()
print(datetime.datetime.now())
return decorated
@datetime_decorator
def main_function():
print("hiru")
main_function()
|
cs |
>>2019-10-02 10:04:31.787821
>>hiru
>>2019-10-02 10:04:31.787821
2. python 인스턴스 메소드, @classmethod와 @staticmethod
- 자바 언어로 객체 지향개념을 배운 사람들은 이 두 데커레이터가 파이썬에 있는 이유 궁금
- 정적메소드란? 클래스에서 직접 접근할 수 있는 메소드 -> @classmethod와 @staticmethod
>> 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있다!
- 주의! 파이썬에서는 다른 언어와는 다르게 정적 메소드임에도 불구하고 인스턴스에서도 접근 가능
2.0 인스턴스 메소드
- 첫번째 인자로 객체 자신 self 자신을 입력
2.1 @classmethod
- 첫번째 인자로 클래스 입력
- @classmethod 데커레이터는 객체가 아닌 클래스에 연산을 수행하는 메서드를 정의
- 메서드가 호출되는 방식을 변경해서 클래스 자체를 첫번쨰 인수로 받게 된다.
- 정적 메소드처럼 인스턴스 없이 호출할 수 있다는점은 같지만, 클래스 메소드는 메소드 안에서 클래스 속성, 클래스 메소드에 접근해야할떄 사용
2.2 @staticmethod
- 정적 메소드
- 특별히 추가되는 인자는 없음
- 메서드가 특별한 첫번째 인수를 받지 않도록 메서드를 변경
- 매개변수에 self를 지정하지 않는다.
- 본질적으로 정적 메서드는 모듈대신 클래스 본체안에 정의된 평범한 함수
- 메서드의 실행 외부 상태에 영향을 끼치지 않는 순수함수를 만들 때 사용된다.
- 인스턴스의 상태를 변화시키지 않는 메서드를 만들때!
1
2
3
4
5
6
|
class example:
@staticmethod
def add(a,b):
return print(a+b)
example.add(10,20)
|
cs |
#인스턴스 메소드 , @classmethod, @staticmethod 차이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Class:
#instance method
def instance_method(self,a,b):
return a+b
#classmethod
@classmethod
def class_method(cls,a,b):
return a+b
@staticmethod
def static_method(a,b):
return a+b
|
cs |
2.3 @classmethod와 @staticmethod의 차이
- @classmethod와 @staticmethod차이는 상속에서 차이가 많이 난다.
- staticmethod에서는 부모 클래스의 클래스 속성값을 가지고 오지만, classmethod에서는 cls인자 사용하여 clas의 클래스 속성을 가져오게 된다.
- Language(English) -> Korean Language(한국어)
- staticmethod시 English -> classmethod일시 한국어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Language:
default_language = "English"
def __init__(self):
self.show = '나의 언어는' + self.default_language
@classmethod
def class_my_language(cls):
return cls()
@staticmethod
def static_my_language():
return Language()
def print_language(self):
print(self.show)
class KoreanLanguage(Language):
default_language = "한국어".
>>>a = KoreanLanguage.static_my_language()
>>>b = KoreanLanguage.class_my_language()
>>>a.print_language()
나의 언어는English
>>>b.print_language()
나의 언어는한국어
|
cs |
3. @property 데코레이터
- Getter,Setter 메소드 표현
- 값을 가져오는 메소드에는 @property 데코레이터를 붙임
- 값을 저장한느 메소드에는 @메소드이름.setter 데코레이터를 붙임
3.1 getter, setter 메소드 표현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Person:
def __init__(self):
self.__age = 0
def get_age(self): # getter
return self.__age
def set_age(self, value): # setter
self.__age = value
james = Person()
james.set_age(20)
print(james.get_age())
>> 20
|
cs |
3.2 getter, setter 메소드 대신 @property 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Person:
def __init__(self):
self.__age = 0
@property
def age(self): # getter
return self.__age
@age.setter
def age(self, value): # setter
self.__age = value
james = Person()
james.age = 20 # 인스턴스.속성 형식으로 접근하여 값 저장
print(james.age) # 인스턴스.속성 형식으로 값을 가져옴
>> 20
|
cs |
<출처>
'Programming > python' 카테고리의 다른 글
신호처리에서의 signal decimate와 spectrogram (1) | 2019.10.03 |
---|---|
python 가변길이 매개변수 *args, **kargs (2) | 2019.10.02 |
[2] 내장 시퀀스 타입 - 깊은 복사와 슬라이싱 연산 (0) | 2019.09.19 |
python datetime library (0) | 2019.09.11 |
python으로 구현한 fft와 librosa library (1) | 2019.09.11 |