[Python] Decorator와 Property에 대해 공부하자

Junkyu_Kang·2024년 12월 12일

Python을 시작할 때 기본 문법에 대해서도 익숙하지 않았다..

대부분 이게 왜 돼???????

자바 개발을 위주로 하다보니 대부분 타입 지정이 불필요한 부분과 배열 혹은 list의 크기를 지정하지 않아도 된다는 부분이 의문이었다.

심지어 get을 할 때 value값으로도 불러와진다? 이거 참 허..

왜 자바개발자들이 파이썬 싫어하는지 알 거 같다.

부러웠던 것....

with이란 기능도 나한테 신선한 충격이었고 쓰레드를 적용할 때도 쉽게 asycio로 적용이 되는 걸 보고 놀랐다..

더 신기한건 파이썬 코드로 알고리즘 풀면 절반...으로 풀 수 있다

그 중 헷깔렸던 내용을 담는다

그건 Decorator와 Property였다

이게 뭐지? 하고 붙어있어서 확인을 했다.

데코레이터 (Decorators)

데코레이터는 함수나 클래스를 수정하지 않고도 기능을 추가하거나 변경할 수 있는 강력한 메커니즘이다.

데코레이터는 다른 함수를 입력으로 받아 새로운 함수를 반환하는 함수로 다양하게 쓰인다..

def my_decorator(func):
    def wrapper():
        print("함수 실행 전")
        func()
        print("함수 실행 후")
    return wrapper

@my_decorator
def say_hello():
    print("안녕하세요!")

say_hello()
# 출력:
# 함수 실행 전
# 안녕하세요!
# 함수 실행 후

위 처럼 wrapper로 감싸서 실행을 시킬 수 있고 이걸 @에서 더 붙여서 사용할 수 있다!

위 코드를 보면 my_decoretor를 지정하고, 그 안에 함수를 넣어 감싸는 걸 볼 수 있다.

더 복잡하게 가보자

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"함수 {func.__name__}이 호출됨")
        result = func(*args, **kwargs)
        print(f"함수 {func.__name__}이 완료됨")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

print(add(3, 5))
# 출력:
# 함수 add이 호출됨
# 함수 add이 완료됨
# 8

위 처럼 감싸고 그 안에 있는 인자를 사용할 수도, 그 안에 name을 확인하여 호출할 수도 있따.

이렇게 보면 쉽죠? 처음 소장님 코드보고 기절할 뻔 했습니다 이게 뭔소린지.. 지피티도 금지당해서 이게 뭔 소리야.. 하고 계속 디버깅했죠

그럼 Property는 뭐냐?

프로퍼티 (Property)

프로퍼티는 객체의 속성에 대한 접근을 제어하고 계산된 속성을 만들 수 있게 해준다! 뭐.. impl에 method 추가한다 생각했는데 그 외에도 굉장히 다양한 기능을 할 수 있다. 마치.. entity에 기능 추가랄까?

class Person:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise ValueError("이름은 문자열이어야 합니다")
        self._name = value

    @name.deleter
    def name(self):
        print("이름을 삭제합니다")
        del self._name

# 사용 예시
p = Person("홍길동")
print(p.name)  # 게터 사용
p.name = "이순신"  # 세터 사용
del p.name  # 딜리터 사용

기본 property 내용이다 보면 알겠지만 property를 통해 인자를 호출한다던가,, 수정한다던가, 삭제하는 등 CRUD 기능을 넣을 수 있다.

자바에서도 getter, setter를 만들어 사용하지않는가.. 비슷하다

또 계산식을 넣어 호출할 수도 있다.

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @property
    def area(self):
        return 3.14 * self._radius ** 2

# 사용 예시
c = Circle(5)
print(c.radius)  # 5
print(c.area)    # 78.5

위 내용을 보면 area란 계산식을 만들어 self 인자를 통해 반환할 수 있죠? 아 쉽습니다 아주 좋아요 이거..

python은 자바처럼 new로 새로운 객체를 만든다 명시하지 않아도 필요 인자값만 넘기면 객체가 만들어지니 그 객체에 대한 값을 바탕으로 계산식을 미리 만들어서 쓸 수 있답니다!

개꿀기능이에요!

profile
강준규

0개의 댓글