여전히 클래스 수업중입니다.
클래스는 쉽지 않네요. 아직 본격적으로 배운것도 아니지만 뒤에 거대한 무언가 있는 느낌입니다.


그래도 강의중에 흥미를 가질만한 것들을 많이 알려주셔서 정신이 한두번? 나갔다 들어왔지만
끝까지 해볼 수 있었습니다.
게임 캐릭터 기준으로 상속 설명해 주신것도 좋았고, 크롤링 해보는 것도 재밌었습니다.
열심히 했지만 타자 못따라 간건 오늘이 처음인듯 하네요.^^


클래스

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 라는 메인 클래스가 있고, HeroMob 이라는 클래스가 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__ 함수를
만들면 됩니다. 과제도 올리고 싶지만 코드가 비슷하기도 하고 일이 있어 시간이 부족합니다.
컴퓨터 앞을 떠나는게 아쉽네요.


어쨌든 드디어 재밌는 영역에 들어서고 있습니다.
뭔가 눈에 보이는 결과들을 만들어 낼 수 있는 단계로 진입하고 있습니다.
갈수록 기대가 됩니다.^^ 끝까지 화이팅!