프로그래밍 /Python

[python] getter, setter, property, decorator 정리

yooj_lee 2021. 8. 21. 01:46
300x250

_로 시작하는 변수 (getter, setter)

(참고: https://www.daleseo.com/python-property/)

: 외부에서 직접 접근이 어려운 변수 (클래스 인스턴스의 내부 데이터를 보호하기 위함)

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.set_age(age)

    def get_age(self): ## getter
        return self._age # 외부에서 직접 접근을 하지 못하고, getter를 통해서만 가능

    def set_age(self, age): ## setter
        if age < 0:
            raise ValueError("Invalid age")
        self._age = age

 

property()

: getter, setter로 변수를 관리하면 변수에 대한 접근이 지저분해진다는 단점이 생김
(property 함수로 지정해주면 field처럼 사용할 수 있음)
아래 코드를 위의 class 코드에 추가해주면 된다.

age = property(get_age, set_age)

 

@property

: property함수를 따로 콜하지 않고, 데코레이터를 이용해서 property 기능 구현 가능

class Person:
	def __init__(self, first_name, last_name, age):
		self.first_name = first_name
		self.last_name = last_name
		self.age = age

	@property
	def age(self):
		return self._age

	@age.setter
	def age(self, age):
		if age < 0:
			raise ValueError("Invalid Age")
		self._age = age

 

이때 getter 메소드에서 get_을 지워주고 @property를 달아줌. 그리고 setter 메소드인 set_age에서도 set_을 지우고 @age.setter를 달아주면 됨. (@<필드명>.setter)


python decorator (@)

(참고: https://dojang.io/mod/page/view.php?id=2427)

데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용한다. 위에서도 함수를 수정하지 않은 상태로 @property를 붙여줌으로써 해당 함수에 property() 함수의 기능을 부여했다.

여러 개의 함수에 기능을 추가 구현하고 싶을 때, 모든 함수를 다 수정하는 것은 어려우므로 위와 같은 방식을 사용하는 것.

데코레이터는 아래와 같이 함수를 감싸는 형태(decorate 함수는 함수 안에서 함수를 만들고 반환하는 클로저 형태)이므로, 함수를 수정하지 않고도 추가 기능을 구현할 수 있다.

def decorate1(func): # 호출할 함수를 매개변수로 받음
	def wrapper(): # 호출할 함수를 감싸는 함수 (wrapper 아닌 다른 이름을 사용해도 무방함)
		print('decorate1') # 여기서는 함수 이름 출력하는 기능을 하도록 함
		func() # 매개변수로 받은 함수를 호출
	return wrapper # wrapper 함수 반환

def decorate2(func):
	def wrapper():
		print('decorate2')
		func()
	return wrapper

# 데코레이터 여러 개 지정 가능
@decorate1
@decorate2
def hello_world():
	print("hello world")

 

300x250