파이썬/파이썬(python) 중급

클래스, 데코레이터 함수, *args, **kwargs

Olivia-BlackCherry 2022. 11. 10. 07:04

User 클래스가 있다.

class User:
    def __init__(self, name):
        self.name= name
        self.is_logged_in= False

 

User 클래스에서 new_user 객체를 생성한다.

new_user = User("Olivia")

 

user라는 파라미터를 하나 가지는 create_my_post 함수를 만든다. 

def create_my_post(user):
    print(f"이것은 {user.name}의 게시글입니다.")

 

실제로 create_my_post 함수를 호출할 때는,

파라미터로 new_user 객체를 넣는다.

create_my_post(new_user)

 

데코레이터 함수를 만들어보자.

is_authenticated_decorator 함수이며, 함수 func을 파라미터로 받는다. 

이 데코레이터 함수의 역할은 is_logged_in이 True인 경우에만 func 함수가 실행되도록 하는 것이다.

def is_authenticated_decorator(func):
    def wrapper():
        if user.is_logged_in==True:
            func()
    return wrapper

 

그런데, 아래의 코드를 실행해보면 에러가 발생한다.

@is_authenticated_decorator
def create_my_post(user):
    print(f"이것은 {user.name}의 게시글입니다.")

왜냐면 create_my_post는 하나의 파라미터를 가지고 있는데, 

위의 코드에서는 func에 파라미터가 없이 호출되기 때문이다.

그래서 파라미터를 넣어줘야 하는데, 이때 쓰는 것이 *args와 **kwargs이다.

*args 가변인수 ----->> 더알고 싶다면 클릭

**kwargs 키워드가변인자 ----->> 더알고 싶다면 클릭

def is_authenticated_decorator(func):
    def wrapper(*args, **kwargs):
        if args[0].is_logged_in==True:
            func(args[0])
    return wrapper

 

 

그 다음 데코레이터 함수를 실행시키면 에러가 나지 않는다.

@is_authenticated_decorator
def create_my_post(user):
    print(f"이것은 {user.name}의 게시글입니다.")

 

 

new_user 객체의 is_logged_in을 True로 바꾸어주고 난 후, 함수를 실행하면 

에러 없이 결과가 나온다.

new_user.is_logged_in=True
create_my_post(new_user)

>>이것은 Olivia의 게시글입니다.

 

 

<최종코드>

class User:
    def __init__(self, name):
        self.name= name
        self.is_logged_in= False

def is_authenticated_decorator(func):
    def wrapper(*args, **kwargs):
        if args[0].is_logged_in==True:
            func(args[0])
    return wrapper


@is_authenticated_decorator
def create_my_post(user):
    print(f"이것은 {user.name}의 게시글입니다.")

new_user = User("Olivia")
new_user.is_logged_in=True
create_my_post(new_user)