여전히 클래스 수업중입니다.
클래스는 쉽지 않네요. 아직 본격적으로 배운것도 아니지만 뒤에 거대한 무언가 있는 느낌입니다.
그래도 강의중에 흥미를 가질만한 것들을 많이 알려주셔서 정신이 한두번? 나갔다 들어왔지만
끝까지 해볼 수 있었습니다.
게임 캐릭터 기준으로 상속 설명해 주신것도 좋았고, 크롤링 해보는 것도 재밌었습니다.
열심히 했지만 타자 못따라 간건 오늘이 처음인듯 하네요.^^
클래스
class Character:
def __init__(self, name, skill, hp, mp, power, defence):
self.name = name
self.skill = skill
self.hp = hp
self.mp = mp
self.power = power
self.defence = defence
def attack(self, next):
next.hp -= self.power
class Item:
엑스칼리버 = {'name': '엑스칼리버', 'power': 1000}
가죽갑옷 = {'name': '가죽갑옷', 'defence': 10}
철갑옷 = {'name': '철갑옷', 'defence': 100}
HP물약 = {'name': 'HP물약', 'hp': 10}
MP물약 = {'name': 'MP물약', 'mp': 10}
def repair(self):
print('수리합니다!')
class Hero(Character, Item):
def __init__(self, name, skill, hp, mp, power, defence, level=1):
# self.name = name # 이렇게 일일이 하지 않고, 아래와 같이 하면 됩니다.
super().__init__(name, skill, hp, mp, power, defence)
self.level = level
self.item = []
def add_item(self, item):
self.item.append(item)
self.power += item.get('power', 0)
self.defence += item.get('defence', 0)
self.hp += item.get('hp', 0)
self.mp += item.get('mp', 0)
def show_item(self):
print(self.item)
class Mob(Character):
pass
# 주인공은 아이템이 있는데!?, 몹은 아이템이 없어요.
# 주인공은 Lv이 있는데!?, 몹은 Lv이 없어요.
# 몹은 Drop하는 아이템이 있는데!?, 주인공은 없어요.
주인공1 = Hero('licat', '질풍검', 100, 100, 10, 0, 1)
몹1 = Mob('licat', '질풍검', 100, 100, 10, 0)
주인공1.attack(몹1)
몹1.hp
주인공1.add_item(Item.엑스칼리버)
주인공1.repair()
주인공1.show_item()
Character
라는 메인 클래스가 있고, Hero
와 Mob
이라는 클래스가 Character
로부터 상속을 받습니다.class Hero(Character, Item):
item
클래스도 함께 상속을 받는데 item
클래스에는 각종 item
을 정의합니다.item
클래스 같은걸 딕셔너리나 리스트 등으로 처리할 수도 있는데 딕셔너리로 만들면 미리 메모리를 확보
해야 하기 때문에 리소스 사용량이 많고, 클래스로 만들면 필요할때 만들어지기 때문에 리소스 관리에 더
용이합니다. 그리고, 데이터 처리가 복잡해 질수록 코드효율도 높아지기 때문에 클래스로 만들어야 합니다.
이터레이터
# 한 번 더 호출!?
# 왜 0, 1, 2, 3, 4가 2번 출력되지 않았는가?
class MyIterator:
def __init__(self, stop):
self.currentValue = 0
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.currentValue >= self.stop:
raise StopIteration
result = self.currentValue
self.currentValue += 1
return result
my_iterator = MyIterator(5)
for i in my_iterator:
print(i)
for i in my_iterator:
print(i)
이터레이터 배우는 과정이 생각보다 재미있었습니다.
for문의 동작 원리를 배우면서 클래스 구성도 알 수 있었습니다.
for문은 기본적으로 __iter__
메소드 한번 실행되고, 반복되는 동안은 __next__
메소드에서
동작하게 됩니다. for문이 종료될때는 raise StopIteration
이 문장으로 종료가 됩니다.
아래 for문을 하나 더 썼을때 출력이 가능하게 하려면 __iter__
메소드 안처럼 클래스 변수를
초기화 해줘야 합니다. __iter__
에서 설정을 해주냐에 따라 달라지는 겁니다.
# 이거 한 번만 출력됩니다!!
# 위와 같은 원리입니다.
# for 돌 때마다 초기화를 해주지 않습니다.
a = map(lambda x:x**2, [1, 2, 3, 4])
for i in a:
print(i)
for i in a:
print(i)
map은 한번만 실행됩니다. __iter__
에서 초기화 설정을 안 해줬음을 알 수 있습니다.zip, map, reversed, filter
가 동일하게 작동되며 sorted
는 재순회가 가능합니다.
재밌죠?
크롤링
import requests # 통신을 해서 서버에서 제공해주는 값을 가져올 수 있습니다.
from bs4 import BeautifulSoup # 가져온 값을 '파싱' 해주는 모듈입니다.
response = requests.get('주소')
soup = BeautifulSoup(response.text, 'html.parser')
크롤링 해주는 간단한 코드도 실습할 수 있었습니다.response = requests.get('주소')
주소 자리에 실제 웹주소가 들어가면 파싱을 할 수 있습니다.
books = []
class Book:
def __init__(self, name='', price=0, author='', info=''):
self.name = name
if price.replace('가격: ', '').replace('원', '').replace(',', '') == '무료':
self.price = 0
else:
self.price = int(price.replace('가격: ', '').replace('원', '').replace(',', ''))
self.author = author
self.info = info
def __str__(self):
return self.name
def __repr__(self):
return self.name
for i, _ in enumerate(book_name):
books.append(Book(
book_name[i].text,
book_info[(i*3)].text,
book_info[(i*3)+1].text,
book_info[(i*3)+2].text
))
books
books[0].name
books[0].price
실습한 코드인데 __str__
과 __repr__
을 지정해주지 않으면 <__main__.Book at 0x7edf2a4d6b00>
이렇게
주소만 출력이 됩니다. 대표하는 내용 보통 값을 출력하고 싶읉텐데 그럴때 __str__
과 __repr__
함수를
만들면 됩니다. 과제도 올리고 싶지만 코드가 비슷하기도 하고 일이 있어 시간이 부족합니다.
컴퓨터 앞을 떠나는게 아쉽네요.
어쨌든 드디어 재밌는 영역에 들어서고 있습니다.
뭔가 눈에 보이는 결과들을 만들어 낼 수 있는 단계로 진입하고 있습니다.
갈수록 기대가 됩니다.^^ 끝까지 화이팅!
'오름캠프(23.12.28 ~ 24.4.18)' 카테고리의 다른 글
오름캠프 학습일지(2024/01/16) - 4주차 2일 (0) | 2024.01.16 |
---|---|
오름캠프 학습일지(2024/01/15) - 4주차 1일 (1) | 2024.01.15 |
오름캠프 학습일지(2024/01/11) - 3주차 4일 (1) | 2024.01.11 |
오름캠프 학습일지(2024/01/10) - 3주차 3일 (1) | 2024.01.10 |
오름캠프 학습일지(2024/01/09) - 3주차 2일 (2) | 2024.01.09 |