Introduction to the Python property decorator
이전 자습서에서는 property class를 사용하여 클래스에 property을 추가하는 방법을 배웠습니다. property class의 구문은 다음과 같습니다.
class property(fget=None, fset=None, fdel=None, doc=None)
class 정의
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
age 속성에 대한 getter를 정의하기위 다음과 같이 property class를 사용합니다.
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
def get_age(self):
return self._age
age = property(fget=get_age)
property는 getter를 받아들이고 property 개체를 반환합니다.
다음은 Person 클래스의 인스턴스를 만들고 인스턴스를 통해 age property의 값을 가져옵니다.
john = Person('John', 25)
print(john.age)
Output:
25
또한 다음과 같이 Person 객체의 get_age()메소드를 직접 호출 할 수 있습니다.
print(john.get_age())
따라서 Person 객체의 나이를 얻으려면 age property 또는 get_age() 메서드를 사용할 수 있습니다. 이로 인해 불필요한 중복이 발생합니다.
이러한 중복을 방지하려면 다음과 같이 get_age() 메서드의 이름을 age() 메서드로 바꿀 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
def age(self):
return self._age
age = property(fget=age)
property()는 callable (age)을 받아들이고 callable 을 리턴합니다. 따라서 데코레이터입니다. 따라서 @property 데코레이터를 사용하여 age() 메서드를 다음과 같이 데코레이팅 할 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
따라서 @property 데코레이터를 사용하면 클래스의 속성 정의를 단순화할 수 있습니다.
Setter decorators
다음은 Set 메서드(set_age)를 추가하여 Person 클래스에 _age 속성에 값을 할당 합니다.
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
def set_age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
age property 객체의 fset에 set_age 할당하려면 다음과 같이 age property 객체의 setter() 메서드를 호출합니다.
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
def set_age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
age = age.setter(set_age)
setter() 메서드는 callable을 받아들이고 다른 callable (property object)을 반환합니다. 따라서 다음과 같이 set_age() 메서드에 데코레이터 @age.setter를 사용할 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def set_age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
이제 set_age() 메서드를 age() 메서드로 변경하고 __init__() 메서드에서 age property을 사용할 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
요약하면 데코레이터를 사용하여 다음 패턴을 사용하여 property을 만들 수 있습니다.
class MyClass:
def __init__(self, attr):
self.prop = attr
@property
def prop(self):
return self.__attr
@prop.setter
def prop(self, value):
self.__attr = value
이 패턴에서 __attr는 private 속성이고 prop은 property이름입니다.
다음 예제에서는 @property 데코레이터를 사용하여 Person 클래스에 name 및 age property을 만듭니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if value.strip() == '':
raise ValueError('The name cannot be empty')
self._name = value
Summary
- @property 데코레이터를 사용하여 클래스의 property을 만듭니다.
property 데커레이터 구문 : @property 사용
class MyClass:
def __init__(self, attr):
self.prop = attr
@property
def prop(self):
return self.__attr
@prop.setter
def prop(self, value):
self.__attr = value
'Python Object-oriented Programming' 카테고리의 다른 글
Callable (0) | 2023.04.02 |
---|---|
Object-oriented Programming (0) | 2023.04.02 |
Metaclass Example (0) | 2023.04.01 |
Metaclass (0) | 2023.04.01 |
type Class (0) | 2023.04.01 |
댓글