본문 바로가기

부스트캠프 AI Tech/Python

[07] 내장함수 property와 Decorator

class C:
    def __init__(self):
        self.__age = 12
    def print_age(self):
        return self.__age
    def change_age(self, new_age):
        self.__age = new_age
        
    age = property(print_age, change_age)
a.__age = 13

위 코드를 실행하면 __age는 private 로 되어있기 때문에 오류가 뜬다.

그래서 __age를 보거나 변경할 때 클래스 내 get, set 함수를 구현하여 변경한다. 위 코드에선

print_age와 change_age를 사용해야한다. 

a.change_age(3)
a.print_age()

이를 한번에 property 함수를 이용해 a.age 를 사용 가능하게 할 수 있다.

a.age = 13
a.age
# 13 출력

내가 헷갈려 했던 것은 property함수가 change_age 함수를 인자로 받았기 때문에 a.age(13) 해야 하지 않을까 라는 생각이 났다. 그냥 property함수는 private 변수를 일반처럼 접근 가능하게 한다고 이해하면 쉽다.

 

property 함수를 데코레이터로 사용하면 아래와 같이 간단하게 짤 수 있다. property를 데코레이터로 사용하면

class의 getter, setter 를 쉽게 사용하게 해준다.

class C:
    def __init__(self):
        self.__age = 12
        
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self, age):
        self.__age = age

@age.setter 부문은 세부적으로 이해안하고 그냥 이렇게 쓰면 되는구나 하고 넘어갔다. 그래야 쉬운듯 하다.

 

데코레이터 제대로 이해하기

def star(func):
    def inner(*args, **kwargs):
        print(args[1] * 30)
        func(*args, **kwargs)
        print(args[1] * 30)
    return inner

@star
def printer(msg, mark):
    print(msg)
    
printer("Hello", '&')

'''출력결과
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Hello
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'''

함수 정의 위에 데코를 하면 그 함수가 데코 함수에 들어 간다고 생각. 

 

좀만 더 복잡하게 데코 2번 한 경우

def star(func):
    def inner(*args, **kwargs):
        print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
    return inner

def percent(func):
    def inner(*args, **kwargs):
        print("%" * 30)
        func(*args, **kwargs)
        print("%" * 30)
    return inner

@star
@percent
def printer(msg):
    print(msg)
    
printer("Hello")
    
'''출력결과
******************************
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hello
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
******************************
'''

데코레이터에 파라미터 있는 경우

데코레이터 함수안에 wrapper 함수 추가하여 구현 가능

def generate_power(exponent):
    def wrapper(f):
            def inner(*args):
                result = f(*args)
                return exponent**result
            return inner
    return wrapper
    
@generate_power(2)
def raise_two(n):
    return n**2
    
print(raise_two(7))

 

'부스트캠프 AI Tech > Python' 카테고리의 다른 글

[09] File Handling  (0) 2022.01.14
[08] Exception  (0) 2022.01.14
[06] Class, Inheritance, Visibility  (0) 2022.01.13
[05] 가변인자  (0) 2022.01.12
[04] Black으로 파이썬 코드 스타일 통일하기  (0) 2022.01.12