KalelPark's LAB

[ CLEAN CODE ] Tuple, namedtuple, logging, class method의 차이 본문

Python/CLEAN CODE

[ CLEAN CODE ] Tuple, namedtuple, logging, class method의 차이

kalelpark 2023. 3. 18. 16:12
 

 코드에서 값을 관리하는 부분이 점점 복잡해지고 있음을 깨닫는 즉시 해당 기능을 클래스로 분리하는 것이 좋습니다.

이를 통하여, 데이터를 더 잘 캡슐화해주는 정의된 인터페이스를 활용하는 것이 가능합니다.

 

우선 기초 지식부터 다듬어 보도록 하겠습니다.

 

인터페이스와 구체적인 구현 사이에 잘 정의된 추상화 계층을 만들 수 있습니다.

 

      Tuple : Tuple 자료 구조는 불변한 순서가 있는 객체로 생성하여, 값을 변경할 수 없음

                  Tuple은 튜플에 있는 요소에 접근할 때, 순서로 기억하기 때문에, 순서로 접근해야 하는 단점이 있음.

                  그러므로, Namedtuple을 사용하면 더욱 편리해집니다.

 

      Namedtuple : Class가 아니고, collections 내 존재합니다.

 

사용 예시

   - 위치 또는 키워드 Argument로 사용이 가능합니다.

   - 인덱스로 접근하는 것이 가능합니다.

   - unpack으로 사용이 가능

   - 필드 이름으로 접근이 가능

   - __repr__ 사용이 가능

from collections import namedtuple

point = namedtuple("point", ["x", "y"])
p = point(11, y = 33)
print(p[0] + p[1])

point_2 = namedtuple("point", "x, y")
a = point_2(11, 33)
print(a[0] + a[1])

Point = namedtuple('Point', 'x y x cler', rename=True)
print(Point.x)
 

logging 코드 수월하게 작성하기

def log_missing():
	print("키 추가됨")
    return 0
    
from collections import defaultdict

current = {"초록" : 12, "파랑" : 3}
increments = [
	("빨강", 5),
	("파랑", 17),
	("주황", 9),
]

result = defaultdict(log_missing, current)
// 만약 값이 존재하지 않으면, logging을 한다는 의미입니다., 
   API 작성 및 코드 분할 시 알아보기 쉽습니다.

classmethod 와 staticmethod의 차이

classmethod

      - 첫 번째  인자로 클래스를 입력합니다. (접근 시, 생략하고 접근해야 합니다..!)

staticmethod

      - 특별히 추가되는 인자가 없습니다.

 

staticmethod는 parentclass의 method를 가져와 적용합니다. 반면에 classmethod는 cls인자를 활용하여, cls클래스의 속성 즉, 자기 자신으로 귀속됩니다.

 

여기서 보면, Language라는 자식class가 존재하고, KoreanLanguage는 부모class가 존재하는데, 부모 class를 상속받을 때, 

@staticmethod는 부모의 요소를 사용하지만, @classmethod는 자기 자신의 것을 활용해서 출력하는 모습을 확인할 수 있습니다.

class Language:
    default_language = "English"

    def __init__(self):
        self.show = "나의 언어" + self.default_language
    
    @classmethod
    def class_my_language(cls):
        return cls()
    
    @staticmethod
    def static_my_language():
        return Language()
    
    def print_language(self):
        print(self.show)

class KoreanLanguage(Language):
    default_language = "한국어"

a = KoreanLanguage()
b = KoreanLanguage()

a.class_my_language().print_language()
b.static_my_language().print_language()

      

 

 

Comments