자동매매 2023. 4. 1. 16:26

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