본문 바로가기
Python Object-oriented Programming

Property Decorator

by 자동매매 2023. 4. 1.

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

댓글