11wk-2: 클래스공부 1단계 – 메소드

Author

최규빈

Published

May 17, 2023

강의영상

youtube: https://youtube.com/playlist?list=PLQqh36zP38-z1m0pVpgKBGMvyvcxcInHv

imports

from IPython.core.display import HTML

지난시간 사용한 코드

class JungKKuckMa:
    pass

pp2023 = JungKKuckMa()
pp2023.title = '파이썬 프로그래밍 중간고사 패배는 괜찮다.'
pp2023.imgurl = 'https://github.com/guebin/PP2023/blob/main/posts/03_Class/PP2023mid.jpg?raw=true?'
pp2023.ques = "Q: 파이썬 프로그래밍 기말고사, 어떤 점에 유의해야 할까?"
pp2023.ans = "A: 최규빈 교수 문제 스타일에 대해서 더 분석할 건 없는 것 같고, 내가 내 코드를 잘 구현하는 게 제일 중요한 것 같고 중간고사는 망하긴 했지만 제 스스로 안 무너지면 충분히 기말고사는 잘 볼 수 있을 것 같아요."
pp2023.highlight = '마음'
pp2023.html_str =\
'''
<style>
    .title {{
        font-family: "Times New Roman", serif;
        font-size: 30px;
        font-weight: 900;
    }}
    .text {{
        font-family: "Arial", sans-serif;
        font-size: 20px;
        font-style: italic;
    }}
    .highlight {{
        font-family: "Montserrat", monospace;
        font-size: 35px;
        font-weight: 900;
        text-decoration: underline;
        font-style: normal;
        color: darkblue;
        background-color: #FFFF00;
    }}
</style>
<p class="title">{ttl}</p>
<img src={url} width="600">
<p> \n </p>
<p class="text">{Q}</p>
<p class="text">{A}</p>
<p class="title">중요한 것은 꺾이지 않는 <span class="highlight">{hl}</span></p>
'''
def show(pp2023):
    _str = pp2023.html_str.format(
        ttl = pp2023.title,
        url = pp2023.imgurl,
        Q = pp2023.ques,
        A = pp2023.ans,
        hl = pp2023.highlight
    )
    display(HTML(_str))
show(pp2023)

파이썬 프로그래밍 중간고사 패배는 괜찮다.

Q: 파이썬 프로그래밍 기말고사, 어떤 점에 유의해야 할까?

A: 최규빈 교수 문제 스타일에 대해서 더 분석할 건 없는 것 같고, 내가 내 코드를 잘 구현하는 게 제일 중요한 것 같고 중간고사는 망하긴 했지만 제 스스로 안 무너지면 충분히 기말고사는 잘 볼 수 있을 것 같아요.

중요한 것은 꺾이지 않는 마음

클래스공부 1단계: 메소드

메소드 (\(\star\))

- 직관:

  1. show라는 함수는 pp2023, burger 외부에 독립적으로 존재하는 함수.
  2. show라는 함수를 과 같이pp2023.titlepp2023 혹은 burger 안에 종속시키고 싶다.

어차피 show는 pp2023, burger와 같이 JungKKuckMa의 인스턴스를 입력으로 받을 예정이므로 pp2023과 burger와 관련이 있다. 그래서 같이 묶는게 깔끔하다는 생각이 든다.

- 시도1: 결국 pp2023.show와 같은 것을 만들고 싶은것이므로 pp2023.title 을 설정하듯이 해보자. \(\to\) 실패

class JungKKuckMa:
    pass

pp2023 = JungKKuckMa()
pp2023.title = '파이썬 프로그래밍 중간고사 패배는 괜찮다.'
pp2023.imgurl = 'https://github.com/guebin/PP2023/blob/main/posts/03_Class/PP2023mid.jpg?raw=true?'
pp2023.ques = "Q: 파이썬 프로그래밍 기말고사, 어떤 점에 유의해야 할까?"
pp2023.ans = "A: 최규빈 교수 문제 스타일에 대해서 더 분석할 건 없는 것 같고, 내가 내 코드를 잘 구현하는 게 제일 중요한 것 같고 중간고사는 망하긴 했지만 제 스스로 안 무너지면 충분히 기말고사는 잘 볼 수 있을 것 같아요."
pp2023.highlight = '마음'
pp2023.html_str =\
'''
<style>
    .title {{
        font-family: "Times New Roman", serif;
        font-size: 30px;
        font-weight: 900;
    }}
    .text {{
        font-family: "Arial", sans-serif;
        font-size: 20px;
        font-style: italic;
    }}
    .highlight {{
        font-family: "Montserrat", monospace;
        font-size: 35px;
        font-weight: 900;
        text-decoration: underline;
        font-style: normal;
        color: darkblue;
        background-color: #FFFF00;
    }}
</style>
<p class="title">{ttl}</p>
<img src={url} width="600">
<p> \n </p>
<p class="text">{Q}</p>
<p class="text">{A}</p>
<p class="title">중요한 것은 꺾이지 않는 <span class="highlight">{hl}</span></p>
'''
# 원래코드 
# def show(pp2023):
#     _str = pp2023.html_str.format(
#         ttl = pp2023.title,
#         url = pp2023.imgurl,
#         Q = pp2023.ques,
#         A = pp2023.ans,
#         hl = pp2023.highlight
#     )
#     display(HTML(_str))
# 수정한코드 
def pp2023.show(pp2023):
    _str = pp2023.html_str.format(
        ttl = pp2023.title,
        url = pp2023.imgurl,
        Q = pp2023.ques,
        A = pp2023.ans,
        hl = pp2023.highlight
    )
    display(HTML(_str))
SyntaxError: invalid syntax (<ipython-input-12-7e81d9b4ed5c>, line 12)

실패했다..

- 시도2: 성공

class JungKKuckMa:
    def show(self):
        _str = self.html_str.format(
            ttl = self.title,
            url = self.imgurl,
            Q = self.ques,
            A = self.ans,
            hl = self.highlight
        )
        display(HTML(_str))
# show함수를 그대로 넣고 pp2023을 self로 바꿈 
pp2023 = JungKKuckMa()

(참고) 이 시점에 pp2023. + tab을 누르면 show 함수가 자동완성 된다.

pp2023.title = '파이썬 프로그래밍 중간고사 패배는 괜찮다.'
pp2023.imgurl = 'https://github.com/guebin/PP2023/blob/main/posts/03_Class/PP2023mid.jpg?raw=true?'
pp2023.ques = "Q: 파이썬 프로그래밍 기말고사, 어떤 점에 유의해야 할까?"
pp2023.ans = "A: 최규빈 교수 문제 스타일에 대해서 더 분석할 건 없는 것 같고, 내가 내 코드를 잘 구현하는 게 제일 중요한 것 같고 중간고사는 망하긴 했지만 제 스스로 안 무너지면 충분히 기말고사는 잘 볼 수 있을 것 같아요."
pp2023.highlight = '마음'
pp2023.html_str =\
'''
<style>
    .title {{
        font-family: "Times New Roman", serif;
        font-size: 30px;
        font-weight: 900;
    }}
    .text {{
        font-family: "Arial", sans-serif;
        font-size: 20px;
        font-style: italic;
    }}
    .highlight {{
        font-family: "Montserrat", monospace;
        font-size: 35px;
        font-weight: 900;
        text-decoration: underline;
        font-style: normal;
        color: darkblue;
        background-color: #FFFF00;
    }}
</style>
<p class="title">{ttl}</p>
<img src={url} width="600">
<p> \n </p>
<p class="text">{Q}</p>
<p class="text">{A}</p>
<p class="title">중요한 것은 꺾이지 않는 <span class="highlight">{hl}</span></p>
'''

(참고) 이 시점에서 pp2023. + tab 을 하면 아래와 같이 보인다. (pp2023 내부에는 ans,highlight, html_str 등과 함께 show도 포함되어있음)

pp2023.show() 

# pp2023.show의 입력을 생략해도, pp2023 자체는 자동으로 입력대상으로 고려 

파이썬 프로그래밍 중간고사 패배는 괜찮다.

Q: 파이썬 프로그래밍 기말고사, 어떤 점에 유의해야 할까?

A: 최규빈 교수 문제 스타일에 대해서 더 분석할 건 없는 것 같고, 내가 내 코드를 잘 구현하는 게 제일 중요한 것 같고 중간고사는 망하긴 했지만 제 스스로 안 무너지면 충분히 기말고사는 잘 볼 수 있을 것 같아요.

중요한 것은 꺾이지 않는 마음

- 암기

  1. 선언하는 방법: 외부에 선언한 show의 코드를 그대로 복붙하여 Class안으로 가져온다. \(\to\) pp2023이라고 되었던 부분을 모두 self로 바꾼다!
  2. 사용하는 방법: pp2023의 내부에 소속된 함수 (ex: pp2023.show) 를 사용할때는, 함수의 사용에 pp2023의 정보를 쓰더라도 (ex: pp2023.title 등), 입력으로 pp2023을 생략한다.

self의 의미 (\(\star\))

- 아래의 코드를 다시 관찰하자.

class JungKKuckMa:
    def show(self):
        _str = self.html_str.format(
            ttl = self.title,
            url = self.imgurl,
            Q = self.ques,
            A = self.ans,
            hl = self.highlight
        )
        display(HTML(_str))
# show함수를 그대로 넣고 pp2023을 self로 바꿈 
pp2023 = JungKKuckMa()

- 관찰

  • selfpp2023 혹은 burger 에 대응한다.
  • selfJungKKuckMa 클래스에서 생성할 인스턴스의 이름에 대응한다.
  • 비유하면 selfJungKKuckMa 에서 태어날 아기의 이름을 대신한다.

- 우리가 하고 싶은 것: 클래스가 설계되는 시점에서, 클래스가 설계완료되고 그 후에 태어날 인스턴스의 이름을 이용해 show 함수의 동작을 define 하는 것

- 즉 아래의 코드에서

    def show(self):
        _str = self.html_str.format(
            ttl = self.title,
            url = self.imgurl,
            Q = self.ques,
            A = self.ans,
            hl = self.highlight
        )
        display(HTML(_str))

def show 이후에 서술된 모든 내용은 시점상 ???? = JungKKuckMa() 가 선언된 이후의 행동을 “미리” 정의하는 코드이며, 이때 self????의 자리를 대신한다.

- self의 의미: ???? = JungKKuckMa() 에 의해서 의하여 태어날 인스턴스 “태명”

  1. 우리는 클래스가 설계되는 시점에서 인스턴스가 태어난 이후에 하게 될 일련의 동작을 정의하고 싶음.
  2. 그런데 클래스가 설계하는 시점에서는 인스턴스의 이름이 정해지지 않았으므로 (아직 태어나지도 않음) 1번의 작업이 불편하다.
  3. 그래서 앞으로는 1번의 작업이 원활하게 진행되도록, 앞으로 태어날 인스턴스의 이름은 모두 self라는 가칭으로 부른다.

- 시점이 꼬일시 발생하는 오류

class JungKKuckMa:
    def show(self):
        _str = self.html_str.format(
            ttl = self.title,
            url = self.imgurl,
            Q = self.ques,
            A = self.ans,
            hl = self.highlight
        )
        display(HTML(_str))
pp2023 = JungKKuckMa()
pp2023.title = '파이썬 프로그래밍 중간고사 패배는 괜찮다.'
# pp2023.imgurl = 'https://github.com/guebin/PP2023/blob/main/posts/03_Class/PP2023mid.jpg?raw=true?'
# pp2023.ques = "Q: 파이썬 프로그래밍 기말고사, 어떤 점에 유의해야 할까?"
# pp2023.ans = "A: 최규빈 교수 문제 스타일에 대해서 더 분석할 건 없는 것 같고, 내가 내 코드를 잘 구현하는 게 제일 중요한 것 같고 중간고사는 망하긴 했지만 제 스스로 안 무너지면 충분히 기말고사는 잘 볼 수 있을 것 같아요."
# pp2023.highlight = '마음'
pp2023.html_str =\
'''
<style>
    .title {{
        font-family: "Times New Roman", serif;
        font-size: 30px;
        font-weight: 900;
    }}
    .text {{
        font-family: "Arial", sans-serif;
        font-size: 20px;
        font-style: italic;
    }}
    .highlight {{
        font-family: "Montserrat", monospace;
        font-size: 35px;
        font-weight: 900;
        text-decoration: underline;
        font-style: normal;
        color: darkblue;
        background-color: #FFFF00;
    }}
</style>
<p class="title">{ttl}</p>
<img src={url} width="600">
<p> \n </p>
<p class="text">{Q}</p>
<p class="text">{A}</p>
<p class="title">중요한 것은 꺾이지 않는 <span class="highlight">{hl}</span></p>
'''
pp2023.show()
AttributeError: 'JungKKuckMa' object has no attribute 'imgurl'

숙제

없습니당