KalelPark's LAB

[CLEAN CODE] Attribute 관리하기, Getter, Setter 본문

Python/CLEAN CODE

[CLEAN CODE] Attribute 관리하기, Getter, Setter

kalelpark 2023. 3. 20. 11:04

파이썬 프로그래밍의 상당 부분은 데이터를 포함하는 클래스를 정의하고,

클래스에 속하는 객체들이 서로 상호작용하는 방법을 기술하는 것으로 여겨집니다. 모든 파이썬 클래스는 함수와 attribute를 함께 캡슐화하는 일종의 컨테이너라고 할 수 있습니다.

파이썬은 데이터를 관리할 때 사용할 수 있도록, 리스트, 튜플, 집합, 딕셔너리 등에서 활용됩니다.

 

* FrequencyList를 리스트(list)의 하위 클래스로 만듦으로써,
   리스트가 제공하는 모든 표준 함수를 FrequencyList에서도 사용할 수 있습니다.

class FrequencyList(list):
    def __init__(self, members):
        super().__init__(members)
    
    def frequency(self):
        counts = {}
        for item in self:
            counts[item] = counts.get(item, 0) + 1
        
        return counts

이제 리스트처럼 느껴지면서, 인덱싱이 가능

foo = FrequencyList(["a", "b", "c", "d", "e", "f"])
print(len(foo))
foo.append("a")
print(foo.frequency())

// 6
// {'a': 2, 'b': 1, 'c': 1, 'd': 1, 'e': 1, 'f': 1}

* Python에서, Class 사용시, Setter와 Getter를 사용하기 전에, 기본적인 Attribute를 사용할 것을 요구합니다.

   나중에, 특별한 기능을 수행해야 한다면.. @property를 사용해, 대응하는 setter를 통하여, 기능을 생성할 수 있습니다.

class Resistor:
    def __init__(self, ohms):
        self.ohms = ohms
        self.voltage = 0
        self.current = 0

class VoltageResistance(Resistor):
    def __init__(self, ohms):
        super().__init__(ohms)
        self._voltage = 0
    
    @property
    def voltage(self):
        return self._voltage
    
    @voltage.setter
    def voltage(self, voltage):
        self._voltage = voltage
        self.current = self._voltage / self.ohms

 Property에 setter를 지정하면, 타입을 검사하거나, 클래스 property에 전달된 값에 대한 검증을 수행하는 것이 가능합니다.

모든 저항값이 0 (Ohm)보다 큰지 확인하는 클래스입니다.

 

이제 잘못된 저항값을 대입하면 예외가 발생합니다., 생성자가 잘못된 값을 넘기는 경우에도 예외가 발생합니다.

대입 시, BoundedResistance가 Resistor메서드를 호출하고, 초기화 메서드가 시작됩니다. 이후, setter 메서드가 호출되어

즉시, 검증을 하는 것이 가능해집니다.

class Resistor:
    def __init__(self, ohms):
        self.ohms = ohms
        self.voltage = 0
        self.current = 0

class BoundedResistance(Resistor):
    def __init__(self, ohms):
        super().__init__(ohms)
    
    @property
    def ohms(self):
        return self._ohms
    
    @ohms.setter
    def ohms(self, ohms):
        if ohms <= 0:
            raise ValueError(f"저항 > 0 이어야 합니다. 실제 값 : {ohms}")
        self._ohms = ohms
Comments