Share
Sign In
TIL 웹개발 - 두 class로 생성한 instance 연결, 공유하는 법
서경태
과제 내용을 보면 두 개의 class를 사용한다.
1.
계정을 생성하는 Member 클래스
2.
포스트를 생성하는 Post 클래스
각 클래스로 생성한 인스턴스를 리스트로 만들어 보여주는데 우리는 덧붙여 포스트를 삭제하는 기능을 넣었다.
그냥 __del__(소멸자: __init__과 반대)를 사용하면 되는거 되네 싶었는데, 실제 서비스에선 다른 사람이 내글을 마음대로 지운다면 진짜
개빡칠 것 아닌가?
그래서 아이디와 비밀번호를 기입해 포스트 삭제에 대한 권한을 부여한다.
members = [m1, m2, m3]
m1 = [name, username, password]
Member 클래스로 만든 member 인스턴스와 인스턴스를 리스트로 만든 memebrs다.
posts [p1, p2, p3]
p1 = [title, content, author]
Post 클래스로 만든 post 인스턴스와 인스턴스를 리스트로 만든 posts다. (단, author = username)
두 데이터를 연결시키는 방법은 post의 author 속성에 Member 클래스 인스턴스를 넣는 것이다.
그러면 아래 이미지처럼 사용할 수 있다.
그럼 p1 = [title, content, m1] 형태로 사용할수 있고 p1의 author를 알고 싶다면 p1.author.username을 사용하면된다. 그리고 만약 p1의 비밀번호를 알려면 p1.author.password를 사용하면 된다.
🖥️
elif select == '4': # 게시글 작성
while True:
id_input = input("ID를 입력해주세요. ")
member_matched = None
for member in members:
if id_input == member.username:
member_matched = member
break
if member_matched:
while True:
ps_input = input("패스워드를 입력해주세요. ")
if ps_input == member_matched.password:
print("게시글을 작성해주세요.")
title = input("\n제목: ")
content = input("내용: ")
posts.append(Post(title, content, member_matched))
print("\n게시글 작성을 완료했습니다.")
break
else:
print("패스워드가 일치하지 않습니다.")
break
else:
print("ID가 존재하지 않습니다. ")
위 코드에선 게시글을 작성할 때, 아이디와 비밀번호를 확인한다. 확인이 맞으면(memebr_matched) 제목과 내용을 기입하고 posts 리스트에 post 객체가 추가되는데 여기서 author에 member_matched를 사용한다.
member_matched는 아이디와 비밀번호로 찾은 member 인스턴스이다.
🖥️
elif select == '5': # 게시글 삭제
del_title = input("삭제할 게시글의 제목을 입력하세요. ")
post_matched = None
for post in posts:
if del_title == post.title:
post_matched = post
break
if post_matched:
while True:
id_input = input("ID를 입력해주세요. ")
if id_input == post_matched.author.username:
while True:
ps_input = input("패스워드를 입력해주세요. ")
if ps_input == post_matched.author.password:
posts.remove(post_matched)
print(f'{post_matched.title}이 삭제되었습니다.')
break
else:
print("패스워드가 일치하지 않습니다.")
break
else:
print("아이디가 일치하지 않습니다.")
이렇게 게시글을 삭제할때, title을 검색해서 삭제할 post를 선택(post_matched라고 정의)하고 username과 password가 일치하면 삭제되는 기능이다.
post_matched.author.username = member.username
post_matched.author.password = member.password
기억하자. 두 클래스는 인스턴스를 공유할 수 있고 그 방법은 한 인스턴스를 다른 클래스의 속성으로 사용하면 된다.
/kyugntae-ai
Subscribe
Other posts in 'TIL 웹개발'See all
TIL 웹개발 - 해시테이블
해시테이블(해시 맵) 키, 밸류 구조로 딕셔너리형태의 자료형 자료를 저장하고 검색하는데 사용하는 중요한 기법 좋은 해시 함수의 조건 해시 함수 값 충돌의 최소화 쉽고 빠른 연산 해시 테이블 전체에 해시 값이 균일하게 분포 사용할 키의 모든 정보를 이용하여 해싱 해시 테이블 사용 효율이 높아야함 로드 팩터 해시테이블에 저장된 데이터 개수 n을 버킷의 개수 k 로 나눈 것 로드 팩터 비율에 따라 해시 함수를 재작성 할지, 크기를 조정할 지 결정한다. 로드팩터가 증가할 수록 해시 테이블 성능은 점점 감소하기에 해시테이블의 공간을 재할당한다. 해시 함수 해시 함수를 통해 키가 해시 값으로 변경되는 과정을 도식화 한 것이다. 윤아와 서현의 값은 해시 함수를 통해 동일한 2를 가지며 충동한 것을 알 수 있다.
서경태
TIL 웹개발 - 알고리즘이란?
파이썬 과정을 마치고 알고리즘과 자료구조에 대한 강의를 시작했다. 알고리즘이란? 같은 문제를 풀더라도 공간적으로 시간적으로 더 효율적으로 풀기 위한 것 시간 복잡도 입력값과 문제를 해결하는데 걸리는 시간과의 상관관계를 말한다. 입력갓이 2배로 늘어났을 때 문제를 해결하는 데 걸리는 시간은 몇 ㅐ로 늘어나는지 보는 것. 공간 복잡도 입력값과 문제를 해결하는데 걸리는 공간과의 상관관계를 말한다. 입력값이 2ㅐ로 늘어났을 때 문제를 해결하는 데 걸리는 공간은 몇 배로 늘어나는지를 보는 것. 점근 표기법 알고리즘의 성능을 수학적으로 표기하는 기법으로 알고리즘의 '효율성'을 평가하는 방법이다. 빅오(Big-O) 표기범 최악의 성능이 나올때 어느정도 연산량이 걸릴지 표기 방법: O(N) N은 얼마나 계산하냐를 말하기 때문에 for문이 한번 있으면 O(N)으로 사용하고 for문이 2개 중첩된 알고리즘은 O(N제곱) 으로 표기한다. 빅 오메가(Big -Ω) 표기법 최선의 성능이 나올때 어느정도의 연산량이 걸릴지 표기 방법: Ω(1) 빅 오메가는 거의 사용하지 않는다. 왜냐하면 보통 최악의 경우를 대비하기때문. 최선은 가장 좋으면 1이지만 최악은.... 상상하기 싫다. 알파벳 찾기 문제
서경태
TIL 웹개발 - flask, request, form
먼저 html에서 form 형태를 작성한다. <form action:'/ 보낼 곳' method = '방식'> action : 어디로 보낼지 정하는 것이다. 파이썬에서 라우트하는 곳으로 설정한게 된다. method : form에서 지원하는 방식은 여러가지가 있는데 보통 get과 post를 사용한다. get은 검색처럼 데이터를 요청할때 사용한다. post는 로그인처럼 정보를 서버에 전달할 때 사용한다. <select name="요청 이름" — — —> <option value ="값"></<option> 부트스트랩에서 사용한 셀렉트 방식으로 가위바위보를 골라서 제출하도록 했다. name : 파이썬이 요청 받을때 여기서 정해진 이름으로 데이터를 받는다. value : name이란 데이터의 값을 말한다. 예를 들어, 가위바위보 게임을 한다면 name은 내가 낼 패를 말하고 value는 가위, 바위, 보 처럼 선택한 값을 말한다. <input button type ='submit'> 버튼을 통해 제출되도록 설정했다. 라우트를 사용해 html의 데이터를 받는다. 위에서 본 action 과 methods를 먼저 써준다. methods는 html에서 post만 사용했는데 왜 둘 다 써야할까? 그 이유는, 사용자가 웹페이지를 처음 방문할 때 기본적으로 get 요청을 통해 페이지를 로딩한다. 따라서 get 메서드를 포함하지 않으면 로딩시 오류가 생길수 있다. get을 사용하지 않더라도 꼭 둘 다 써야함을 기억하자! user_choice = request.form['user_choice'] 로 name과 같은 값을 통해 value값을 매개변수(user_choice 앞에 거)에 지정한다. 이렇게 하면 form은 정상적으로 작동한다.
서경태