Today I Learned | 7월 12일 class·decorator 예제, 정적메소드와클래스메소드

juri·2021년 7월 12일
0

TIL

목록 보기
10/25
post-thumbnail

오늘 뭐했지

1 class, decorator 예제 만들기
2 정적메소드와 클래스메소드
3 session <데이터베이스>


1. class, decorator 예제 만들기

replit 과제를 마치고 시간이 조금 남아서 내가 제일 헷갈려하는 개념들을 공부하는 시간을 가졌다. 가장 어려웠던 class와 decorator를 직접 만들어보았다.

1-1.class

지극히 개인적인 흥미를 위한 클래스를 만들어보았다. 물론 실생활엔 아무짝에도 쓸모없다.

code1

목표

  • 딕셔너리에 key:번호, value:정보 인 데이터 저장하기
  • 딕셔너리메서드 setdefault() 써보기
  • 자동으로 각 데이터에 인덱스 붙이기
class Bag :

	def __init__ (self, name, group) :
		self.name = name
		self.group = group
		self.db = {}
		self.member_id = 0

	def insert(self, field, value) :
		self.member_id += 1
		self.field = field
		self.value = value
		#self.db.setdefault(self.member_id, [self.field, self.value])
		self.db[self.member_id] = [self.field, self.value]

	def select(self, number) :
		self.number = number
		if self.number not in self.db.keys() :
			return 'There is no data'
		return f'번호:{self.number} 정보:{self.db[self.number]}'


	def __str__(self) :
		return f'최애 {self.db[1]},차애 : {self.db[2]}'

love = Bag('번호', '정보')

love.insert('monstax', 'HY')
love.insert('nct','RJ')

print(love.select(2))
print(love)
#결과
번호:2 정보:['nct', 'RJ']
최애 ['monstax', 'HY'], 차애 : ['nct', 'RJ']

리뷰

  • 굳이 setdefault를 쓸 필요는 없어보임. 이건 미니 트위터 클론할 때 공부했던 메서드인데 계정을 생성한 뒤에 팔로우를 해본 적 없는 계정의 데이터에 set형 데이터를 default값으로 저장하는 기능이었던 것 같다.
  • 모든 변수에 self를 붙여보긴 했는데 error가 없으니까 잘 쓴거겠지?!
  • __int____str__등의 메직메소드의 활용법을 조금이나마 이해한 것 같다. 역시 직접 써보는게 이해가 잘 된다. 더 많은 클래스 예제를 참고해야겠다.
  • 자동 인덱스 붙이기성공 !
  • f-strings도 익숙해지니까 정말 편리한 기능이구나 format 보다 훨씬 간단하다.

code2

목표

  • 리스트에 set값 넣기
  • 자동으로 인덱스 붙이기
class Idol :
	bag = []
	number = 0

	def put_bag(self, name) :
		self.number +=1
		self.bag.append((self.number, name))


MX = Idol()
MX.put_bag('mh')
MX.put_bag('hy')

print(MX.bag)
#[(1, 'mh'), (2, 'hy')]

리뷰

  • MX.bag으로 bag이라는 리스트에 저장된 모든 데이터를 볼 수 있음 . 위의 code1도 마찬가지로 love.db를 통해 내 망태기 안을 볼 수 있다.

1-2.decorator

간단하게 말하면 @를 붙인 코드가 가끔 보이는데 이것들이 '데코레이터'다. 원래 함수를 수정하지않고 추가기능을 구현할 때 주로 사용한다. 예를 들어, 함수가 리턴값을 print하게 수정하고 싶을 때 수많은 함수의 내용을 수정하지않고 리턴값을 print하는 새로운 함수를 만들어 데코레이터로 사용하는 것이다. (또는, 어떤 함수가 실행되기 전에 선행되어야하는 함수가 있을 때 두 함수의 선후관계를 표시하기위해 사용한다.)
데코레이터로 사용하는 함수는 항상 '중첩함수'의 형태를 갖는다.

def test(func) :
    def wrapper():
        print(func)
    return wrapper

데코레이터인 test()는 호출할 함수 func()를 매개변수로 받는다. wrapper()함수가 func()를 출력한 뒤 wrapper()함수 자체를 반환한다. -> 결국 test()함수는 wrapper()함수가 반환하는 값을 반환한다.

@test
def func() :
  ..생략

데코레이터는 위와 같이 @를 이용해 간단하게 표시한다. 지금 예시로 든 함수들은 매개변수를 받지않아 비교적 형태가 간단하다. 만약 함수가 매개변수를 받는다면 한번 더 중첩을 한 모양을 갖게된다. 복잡하니까 설명은 pass.

code1

목표

  • type_check() : 함수의 매개변수가 지정된 클래스면 함수를 정상적으로 호출
    지정된 자료형과 다르면 RuntimeError을 발생시키고 '자료형이 다릅니다' 출력
@typecheck(int,int)
def add(a,b) :
    return a+b
def typecheck(type_a, type_b):
    def real_decorator(func) :
        def wrapper(a,b) :
            if isinstance(a,type_a) and isinstance(b,type_b) :
                return func(a,b)
            else :
                raise RuntimeError('자료형이 다릅니다')
        return wrapper
    return real_decorator

리뷰

  • 데코레이터함수인 type_check()함수가 매개변수를 받음 -> 이중으로 중첩된 함수를 사용
  • isinstance()를 사용해 자료형을 확인한 후 raise로 지정된 에러와 문구를 출력
#자료형이 정수형인지 확인 후 에러와 문구를 출력.
if not x is int :
    raise TypeError('숫자를 적어주세요.')
  • 데코레이터 함수를 만드는 순서가 대충 비슷해서 익숙해지면 지금보다 더 잘할 수 있을 것 같다..

2.정적메소드, 동적메소드

2-1.정적메소드

메소드 위에 @staticmethod를 붙인다. 정적메소드는 매개변수에 self를 지정하지 않는다.

class Data :
    @staticmethod
    def add(a, b)
    	return a+b
        

Data.add(1,2)

클래스에서 바로 메소드를 호출할 수 있다. self를 매개변수로 지정하지않기 때문에 인스턴스.메소드를 호출할 수 없다.(인스터스 속성에 접근할 수 없다.)
정적 메소드는 인스턴스의 상태를 변화시키지않는 메소드를 만들 때 사용한다. 예를 들면, 위의 code1에서 insert메소드는 정적 메소드를 사용할 수 없다.

2-2.클래스메소드

메소드 위에 @classmethod를 붙이고 매개변수의 맨 앞자리에 self대신 cls를 지정해야한다.

class Bag :
	number = 0

	def __init__(self) :
	    Bag.number += 1

	@classmethod
	def print_number(cls) :
	    print(f'망태기안에 {cls.number}명이 있습니다.')

MX = Bag()
NCT = Bag()

Bag.print_number()

#망태기안에 2명이 있습니다.

인스턴스를 지정할 때마다 클래스 속성인number가 하나씩 커진다. cls를 사용해서 클래스 속성에 접근할 수 있다. 정적 메소드와 같이 인스턴스를 사용하지않고 클래스에서 바로 메소드를 호출할 수 있다.

무슨 얘기인지는 알겠는데 정확히 어떤 상황에서 어떤 메소드를 써야하는지 판단하는데에는 시간이 걸릴 것 같다. 갈 길이 멀구나 ~

3. session <데이터베이스>

데이터베이스(Database)란?

  • 컴퓨터 시스템에 저장된 정보나 데이터의 집합
  • 데이터를 저장한 하드웨어 혹은 데이터베이스 관리 시스템을 통칭한다.

데이터베이스를 사용하는 이유

  • 필요한 자료를 오래 저장하고 보존하기위해
  • 데이터를 체계적으로 정리하고 관리하기위해

관계형 데이터베이스 (RDBMS)

관계형 데이터모델에 기초를 둔 데이터베이스 시스템
1. 행(row)과 열(column)으로 이루어진 2차원 테이블로 표현이 가능하다.
2. 각 행은 고유한 primary key(Pk)가 있고 외부 테이블의 Foreign key(Fk)와 연결될 수 있다.
3. 각각의 테이블은 상호관련성을 갖고 서로 연결될 수 있다.

관계형 DB의 종류

  • one to one
  • one to many
  • many to many
    : 테이블 연결 시 중복을 제거하기 위해서 정규화(normalization) 과정 중에 중간테이블이 생성된다.

Assignment

AQueryTool을 이용해 스타벅스 서비스를 모델링해보자.

1차 스타벅스 서비스 모델링

  • 메인테이블에 음료를 중심으로 1대1 관계의 속성들을 적음

  • 음료와 다대다 관계인 알러지는 중간테이블을 작성해서 두 테이블을 연결

  • 카테고리는 음료의 상위 테이블이라고 생각해서 메인테이블의 카테고리id를 fk로 카테고리 테이블의 pk인 카테고리id와 연결

  • 영양정보는 한 세트의 정보를 갖고있다고 생각했을 때 음료와 1대1 관계이기때문에 메인테이블에 있어도 상관은 없다고 생각함

  • pk와 fk의 관계의 역전이 어떤 의미를 갖는지 궁금하다.

    내일 모델링 리뷰 세션을 듣고 수정해보아야겠다.

    하루 끝 ~

profile
Make my day !

0개의 댓글