1class, decorator 예제 만들기
2정적메소드와 클래스메소드
3session <데이터베이스>
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 oneone to manymany to manyAssignment
AQueryTool을 이용해 스타벅스 서비스를 모델링해보자.
1차 스타벅스 서비스 모델링
메인테이블에 음료를 중심으로 1대1 관계의 속성들을 적음
음료와 다대다 관계인 알러지는 중간테이블을 작성해서 두 테이블을 연결
카테고리는 음료의 상위 테이블이라고 생각해서 메인테이블의 카테고리id를 fk로 카테고리 테이블의 pk인 카테고리id와 연결
영양정보는 한 세트의 정보를 갖고있다고 생각했을 때 음료와 1대1 관계이기때문에 메인테이블에 있어도 상관은 없다고 생각함
pk와 fk의 관계의 역전이 어떤 의미를 갖는지 궁금하다.
내일 모델링 리뷰 세션을 듣고 수정해보아야겠다.
