1
class, decorator 예제 만들기
2
정적메소드와 클래스메소드
3
session <데이터베이스>
replit 과제를 마치고 시간이 조금 남아서 내가 제일 헷갈려하는 개념들을 공부하는 시간을 가졌다. 가장 어려웠던 class와 decorator를 직접 만들어보았다.
지극히 개인적인 흥미를 위한 클래스를 만들어보았다. 물론 실생활엔 아무짝에도 쓸모없다.
목표
- 딕셔너리에
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
를 통해 내 망태기 안을 볼 수 있다.
간단하게 말하면 @
를 붙인 코드가 가끔 보이는데 이것들이 '데코레이터'다. 원래 함수를 수정하지않고 추가기능을 구현할 때 주로 사용한다. 예를 들어, 함수가 리턴값을 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('숫자를 적어주세요.')
- 데코레이터 함수를 만드는 순서가 대충 비슷해서 익숙해지면 지금보다 더 잘할 수 있을 것 같다..
메소드 위에 @staticmethod
를 붙인다. 정적메소드는 매개변수에 self
를 지정하지 않는다.
class Data :
@staticmethod
def add(a, b)
return a+b
Data.add(1,2)
클래스에서 바로 메소드를 호출할 수 있다. self
를 매개변수로 지정하지않기 때문에 인스턴스.메소드
를 호출할 수 없다.(인스터스 속성에 접근할 수 없다.)
정적 메소드는 인스턴스의 상태를 변화시키지않는 메소드를 만들 때 사용한다. 예를 들면, 위의 code1에서 insert
메소드는 정적 메소드를 사용할 수 없다.
메소드 위에 @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
를 사용해서 클래스 속성에 접근할 수 있다. 정적 메소드와 같이 인스턴스를 사용하지않고 클래스에서 바로 메소드를 호출할 수 있다.
무슨 얘기인지는 알겠는데 정확히 어떤 상황에서 어떤 메소드를 써야하는지 판단하는데에는 시간이 걸릴 것 같다. 갈 길이 멀구나 ~
관계형 데이터모델에 기초를 둔 데이터베이스 시스템
1. 행(row)과 열(column)으로 이루어진 2차원 테이블로 표현이 가능하다.
2. 각 행은 고유한 primary key(Pk)가 있고 외부 테이블의 Foreign key(Fk)와 연결될 수 있다.
3. 각각의 테이블은 상호관련성을 갖고 서로 연결될 수 있다.
one to one
one to many
many to many
Assignment
AQueryTool을 이용해 스타벅스 서비스를 모델링해보자.
1차 스타벅스 서비스 모델링
메인테이블에 음료를 중심으로 1대1 관계의 속성들을 적음
음료와 다대다 관계인 알러지는 중간테이블을 작성해서 두 테이블을 연결
카테고리는 음료의 상위 테이블이라고 생각해서 메인테이블의 카테고리id를 fk로 카테고리 테이블의 pk인 카테고리id와 연결
영양정보는 한 세트의 정보를 갖고있다고 생각했을 때 음료와 1대1 관계이기때문에 메인테이블에 있어도 상관은 없다고 생각함
pk와 fk의 관계의 역전이 어떤 의미를 갖는지 궁금하다.
내일 모델링 리뷰 세션을 듣고 수정해보아야겠다.