티스토리 뷰

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+
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 = "한국어".
 
>>>= KoreanLanguage.static_my_language()
>>>= 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

 

 

 

<출처> 

1. 파이썬코딩도장 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/11   »
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 28 29 30
글 보관함