데코레이터의 한 유형은 속성 getter 및 setter입니다. 이러한 데코레이터를 사용하면 클래스 인스턴스의 변수에 대한 액세스를 제어할 수 있습니다.
속성 getter 및 setter는 객체 지향 프로그래밍의 속성 제어를 위해 특별히 설계되었습니다. 이는 클래스 속성에 사용된다는 점에서 함수 데코레이터와 다릅니다(여기에서 함수 데코레이터에 대한 내 게시물을 확인하세요).
함수 데코레이터와 속성 getter 및 setter 데코레이터는 모두 재사용 가능한 코드로 코드를 수정하고 '@' 구문을 사용합니다. 둘 다 코드의 기능을 변경합니다.
자, 시작해 보겠습니다.
속성 getter 및 setter는 클래스 내의 메서드에 적용되어 다양한 동작을 정의합니다. setter는 속성을 값으로 설정하고, getter는 클래스에서 속성을 가져옵니다. 속성이 먼저 설정됩니다.
예를 살펴보고 세부적으로 살펴보겠습니다.
class Shoe: def __init__(self, brand = "Adidas", size = 9): self.brand = brand self.size = size self._condition = "New" @property def size(self): """The size property""" return self._size @size.setter def size(self, size): """size must be an integer""" if isinstance(size, int): self._size = size else: print("size must be an integer") def cobble(self): """Repairs the shoe and sets the condition to 'New'.""" self.condition = "New" print("Your shoe is as good as new!") @property def condition(self): """The condition property""" return self._condition @condition.setter def condition(self, condition): self._condition = condition
다음 코드 중 일부를 살펴보겠습니다.
일부 속성(상태, 크기) 앞의 밑줄은 개발자에게 해당 속성이 비공개임을 나타냅니다. 이는 Shoe 클래스의 각 인스턴스(각 신발, 소문자)에만 적용됩니다.
조건과 크기가 다르게 인스턴스화되는 것을 볼 수 있습니다. self._condition = "New"는 신발 클래스의 각 인스턴스(또는 개체)가 "New" 조건으로 인스턴스화됨을 의미합니다. 크기 속성에 대해서도 동일한 작업이 수행되지만 크기는 정수여야 하기 때문에 setter 속성 유효성 검사를 트리거하도록 self._size = 9로 작성되지 않습니다(이를 유효성 검사라고 하는 프로세스입니다). 속성 setter 및 getter 메서드를 통해 실행하는 대신 각 개별 신발 개체의 조건을 직접 설정합니다.
cobble 메소드는 각 신발 객체의 속성을 가져오거나 설정하는 것이 아니라 단순히 작업을 수행하기 때문에 데코레이터가 필요하지 않습니다.
코드를 마지막으로 변경해 보겠습니다. 예를 들어 나중에 크기 속성을 변경할 수 없도록 하려면 어떻게 해야 할까요? 결국, 신발의 크기는 실제로 변하지 않습니다. 그렇죠?
hasattr() 함수를 사용하여 각 신발 객체를 검사할 수 있습니다. '_size'로 표시되는 비공개 크기 속성이 있나요? 그렇다면 변경할 수 없습니다. 구현된 코드는 다음과 같습니다.
@size.setter def size(self, size): """size must be an integer and can't be changed once set""" if hasattr(self, '_size'): raise AttributeError("Can't change size once set") if isinstance(size, int): self._size = size else: raise ValueError("size must be an integer")
속성 설정자와 게터는 이해하기가 약간 어렵지만 일단 이해하고 나면 전문가처럼 Python을 코딩하게 될 것입니다!
출처:
아이언 학교 자료
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3