[혼공학습단 7기] 혼공파 6주차

·2022년 2월 21일
0

파이썬

목록 보기
5/7

..지각 사유 : 매주 일요일에 마무리해서 올려왔는데 하필 저번주 일요일이 제 생일이였어서 노느라 잊어버렸어요오오오........😭😭

07 모듈

07-2 외부 모듈

모듈 설치하기

pip install 모듈이름
pip install 모듈이름==1.0.0

pip install을 써서 외부 모듈을 설치할 수 있음! 외부 모듈은 기본적으로 제공해주는게 아니라서 꼭 다운받아야햇..~

두번째줄은 버전의 변경을 피하기 위해 강제로 버전을 지정해서 모듈을 설치하는 코드예오

모듈 사용 방법

(1) 모듈의 문서(또는 책) 등을 본다.
(2) 모듈에서 사용하는 추가적인 지식(다른 프로그래밍 언어 또는 수학)을 공부한다.
(3) 모듈과 모듈을 조합해서 더 큰 가치를 만들어낸다.

BeautifulSoup 모듈


나는 비쥬얼 스튜디오 터미널에서 설치가 안 돼서 cmd창 갔다옴 ㅠㅎ

html_doc = """
<html>
    <head>
        <tite>TEST PAGE</title>
    </head>
    <body>
        <h1>HELLO WORLD</h1>
    </body>
</html>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.select("h1"))
print(soup.select("h1")[0].string)

가져올 html코드를 BeautifulSoup의 첫번째 매개변수로 넣고 두번째 매개변수는 일단 'html.parser'을 기본적으로 써준다고 생각하면 될듯(아니면 아래에서 또 언급하겠습니닿=^^7)

그리고 BeautifulSoup의 select 속성은 보고 싶은 태그의 이름을 쓰면 되는!! 그러면 태그부터 닫는 태그까지 리스트로 보여줌ㅎㅅㅎ 리스트의 대괄호 없이 내용만 보려고 soup.select("h1")[0] 요렇게 쓴 겅미

이 코드를 다른 모듈인 urllib와 조합해서 쓰면

from urllib import request
from bs4 import BeautifulSoup

content = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109")
soup = BeautifulSoup(content, 'html.parser')

for data in soup.select("data"):
    print("시간: ", data.select_one("tmef").string)
    print("날짜: ", data.select_one("wf").string)
    print("-" * 20)

select()와 select_one()의 차이!
select()는 조건에 맞는 태그를 여러 개 가져오고,
select_one()은 조건에 맞는 태그를 딱 한 개만 가져 옴!

책에 있는 코드도 보니까 for문 돌릴땐 그냥 select쓰고 for문 안에서 특정 정보를 추출할땐 select_one를 쓰면 되는듯합니더

Flask 모듈

Beautiful Soup는 html 문서에서 데이터를 가져왔다면 Flask 모듈은 파이썬에서 웹브라우저에 무언갈 쓸 수 있는 모듈임

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

"""
$ set FLASK_APP = 07-2_ex.py
$ flask run
"""

hello() 함수에 리턴되는 값이 웹브라우저에 들어가게됨! 저기에 html 코드를 쓰면 됩니다용

return "<h1>안녕하세요</h1>"

해도 되는 겅미

기본 미션: BeautifulSoup 스크레이핑 실행하기


..잠시만요 저 욕 나올 거 같아서! 진정 좀 할게요ㅠㅠ 머가 문제니.... 왜 문제가 되는 거니.....
=> 그냥.. 비쥬얼 스튜디오의 오류였음!

그리고 저 맨 아래에 두줄이 없으니까 링크가 안 떠서 내 맘대로 추가했음
=> if문은 필요 없는 거 같아서 지우고 app.run()만 남겨둠!

이제는 이 에러를 해결해보겠음! 하 진심 에러 다음에 에러 다음에 에러 다음에 에러는 날 지치게 한다..^^!!!!!!!!!!!!

from random import betavariate
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

app = Flask(__name__)
@app.route('/')

def hello_world():
    target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
    soup = BeautifulSoup(target, "html.parser")
    output = "웅?"
    return output

if __name__ == '__main__':
	app.run()

일단 for문 돌리기 전까지는 정상적으로 웹사이트에 글씨가 써짐!

from random import betavariate
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

app = Flask(__name__)
@app.route('/')

def hello_world():
    target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
    soup = BeautifulSoup(target, "html.parser")
    output = "웅?"
    for location in soup.select("location"):
        output = "흑흑 제발"
    return output

if __name__ == '__main__':
	app.run()

흠 ㅡㅡ 일단 for문 돌리는 거 자체는 문제가 없어보임
저 안에 if문이 잘못된 거 같아여

from random import betavariate
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

app = Flask(__name__)
@app.route('/')

def hello_world():
    target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
    soup = BeautifulSoup(target, "html.parser")
    output = ""
    for location in soup.select("location"):
        output += "<h3>{}</h3>".format(location.select_one("city").string)
    return output

if __name__ == '__main__':
	app.run()

허억허억 지역 이름이 다 나오기 시작햇다 허억허억

        output += "최저/최고 기온: {}/{}".format(\
            location.select_one("tmn".string),\
            location.select_one("tmx".string)\
            )

아아아아니......지민쨩....... .string이 왜 괄호 안에 있어ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ )의 위치가 이렇게 중요하네요....


지금 어이없어서 죽고 싶음ㅎㅎㅎㅎㅎ 저 수많은 탭들이 보이시나요미..~ 그래도 오류 해결해서 다행이닿ㅎ

라이브러리와 프레임워크

라이브러리는 정상적인 제어 방법으로 사용하는 모듈을,
프레임워크는 제어 역전(IoC: Inversion of Control)이 일어나는 모듈을 말한다리

정상적인 제어 방법이란 개발자가 직접 모듈을 사용한 걸 말하는 겅미
제어 역전은 반대로 모듈이 개발자의 코드를 사용하는 거!!!!!

BeautifulSoup랑 Math가 라이브러리, Flask를 프레임워크로 볼 수 있음

07-3 모듈 만들기


먼저 이렇게 폴더 하나랑 파일 두개를 만들어주고

(어떤 파일인지 눈에 보이는게 좋을 거 같아서 캡처본!)
my_module.py 파일에 요런 코드를 써놓고

start.py 파일에서

import my_module

을 해주면 my_module.py 파일의 변수랑 함수들이 속성이 됨!
그래서 my_module.a my_module.b my_module.c()하면 my_module의 a,b,c를 불러서 쓸 수가 있는겅미...!!!!넘 재밋다

하지만 같은 폴더에서만 가능하다는 거! 기억해주긔

파일이 여러 개로 분할하게 되면 내가 지금 실행되고 있는 부분(모듈)이 어느 파일인지 알아야하는 상황이 발생하기 때문에

__name__

라는 특수한 변수가 생겼음!
짚고 넘어가야하는 용어가 있습니다요

모듈을 import한 파일을 실행하면
파일 > 모듈 > 모듈 > 모듈
이렇게 실행되는데 이때 처음 진입한 파일을 진입점(= 엔트리 포인트 = 메인)이라고 부름

start.py랑 my_module.py 코드 맨 위에

print(__name__)

을 추가하고

#start.py
print(__name__)

import my_module
print(my_module.a)
print(my_module.b)
print(my_module.c())

start.py를 실행시키면

#출력 결과
__main__
my_module
10
20
30

이렇게 출력됨
우선 start.py의 첫번째 줄에서 __main__이 출력되고
그 다음에 import my_module을 하잔음! 그때 my_module.py을 실행하게 되는데 my_module.py의 첫줄에서 __name__을 출력하게 되는데 여기서 __name__에 해당되는 값이 my_module.py의 파일명인 my_module이기 때문에 두번째로 my_module이 출력되는 거임!

ㅎ 문장을 못 끊는 나애 설명...... 이해가 되실란지요....ㅎㅎㅎ 근데 일단 나는 이해했음용!ㅎㅎㅎ

이걸 활용해서 현재 실행되고 있는 파일이 엔트리 포인트인지 아닌지 확인하려면

__name__ == "__main__"

이 코드를 활용하면 됨! 엔트리 포인트면 True를 반환할 거고 아니면 False를 반환할 거니께

좀 더 알아보기①: 텍스트 데이터

파이썬은 파일을 텍스트 데이터와 바이너리 데이터로 구분함!

좀 더 알아보기②: 바이너리 데이터

08 클래스

08-1 클래스의 기본

객체

이야^ㅁ^ 프로그래밍 이론적인 부분을 여기서 또 만나다니..응응 진로 바꾸지 않는 이상 평생 봐야되니까 그냥 즐기겠음ㅋ


선택 미션

-객체
일단 객체! 일단 객체는 실세계에 존재하는 모든 것이 될 수 있음! 객체는 속성이랑 행위를 가지고 있는데 필요한 속성, 행위를 생각하는걸 모델링한다고 할 수 있웅

-클래스
클래스가 있어야 객체를 만들 수 있는데 클래스를 붕어빵 틀, 객체를 붕어빵으로 비유할 수 있다리 하나의 붕어빵 틀(클래스)로 여러 개의 붕어빵(객체)을 만들 수 있잖음?? 클래스는 객체를 만들 수 있는 형판으로 보면 됨

나는 어떻게 이해했었냐면 클래스에는 빈 변수들이 있고 객체는 그 빈 변수에 각자 고유의 값을 가지는 것들...이라고 이해했음 이게 !!!완전 맞는 얘기는 아니지만!!! 그냥 고유의 값을 넣으면 객체가 만들어진다....정도?ㅎㅎ 할튼 난 이렇게 이해했었음

-인스턴스
객체를 5개 생성해서 5개가 있는데 그 중 쓰이고 있는 하나의 객체를 인스턴스 객체라고 함! 그니까 결국은 5개 모두 인스턴스 객체가 될 수 있고 인스턴스 객체인 거임 근데 순간적으로 인스턴스 객체는 1개인..겅미 지금 인스턴스 객체 누구야!!!!!하면 그때 쓰이고 있는 객체 1개만 인스턴스 객체라고 할 수 있는 거!!!!

-생성자 : 객체를 생성할 때 객체를 초기화하는 메서드. 객체를 생성할때 무조건 실행됨

-메소드 : 클래스 안에 있는 함수


자아 그러면 파이썬의 객체를 살펴보자고요

students = [
    {"name":"김윤서", "korean": 87, "math":98, "english":88, "science":95},
    {"name":"배서연", "korean": 92, "math":98, "english":96, "science":98},
    {"name":"백지민", "korean": 76, "math":96, "english":94, "science":90},
    {"name":"양다연", "korean": 98, "math":92, "english":96, "science":92},
    {"name":"이예진", "korean": 95, "math":98, "english":98, "science":98},
    {"name":"이주완", "korean": 64, "math":88, "english":92, "science":92},
]
print("이름", "총점", "평균", sep="\t")
for student in students:
    score_sum = student["korean"]+student["math"]+\
        student["english"]+student["science"]
    score_average = score_sum/4

    print(student["name"], score_sum, score_average, sep="\t")

자아.......교재에 있는 코드를 열심히 카피했음
여기서는 저 학생 개인개인이 객체인 거!
아래에 그냥 for문에 갇혀있는 총점, 평균, 출력을 함수로 만들어봅시당

students = [
    {"name":"김윤서", "korean": 87, "math":98, "english":88, "science":95},
    {"name":"배서연", "korean": 92, "math":98, "english":96, "science":98},
    {"name":"백지민", "korean": 76, "math":96, "english":94, "science":90},
    {"name":"양다연", "korean": 98, "math":92, "english":96, "science":92},
    {"name":"이예진", "korean": 95, "math":98, "english":98, "science":98},
    {"name":"이주완", "korean": 64, "math":88, "english":92, "science":92},
]
def 총점(student):
    return student["korean"]+student["math"]+\
        student["english"]+student["science"]
def 평균(student):
    return 총점(student)/4
def 출력(student):
    print(student["name"], 총점(student), 평균(student), sep="\t")

print("이름", "총점", "평균", sep="\t")
for student in students:
    출력(student)

훨씨인.......간결해졋다 역시 함수

def 학생_생성(name, korean, math, english, science):
    return {
        "name": name,
        "korean": korean,
        "math": math,
        "english": english,
        "science": science
    }

def 총점(student):
    return student["korean"]+student["math"]+\
        student["english"]+student["science"]
def 평균(student):
    return 총점(student)/4
def 출력(student):
    print(student["name"], 총점(student), 평균(student), sep="\t")

students = [
    학생_생성("김윤서", 87, 98, 88, 95),
    학생_생성("배서연", 92, 98, 96, 98),
    학생_생성("백지민", 76, 96, 94, 90),
    학생_생성("양다연", 98, 92, 96, 92),
    학생_생성("이예진", 95, 98, 98, 98),
    학생_생성("이주완", 64, 88, 92, 92)
]

print("이름", "총점", "평균", sep="\t")
for student in students:
    출력(student)

꺄..객체 만드는 함수 만드니까 더 간편해졋어
위에서 말했듯이 클래스가 있어야 객체 생성이 가능하다고 했던 거! 기억하시나요미~~~ 이제 객체를 만드는 클래스 구문을 배워봅시다요

클래스 구문 - 속성과 행위 합치기

class 학생:
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science

이렇게 생김! class가 없을땐 그냥 name, korean, math, english, science만 매개변수로 있었는데 class 안에 있는 함수의 매개변수엔 맨 앞에 self가 있어야댕. self가 예약어는 아님!! 하지만 상수 변수는 대문자로 쓰듯이 개발자들 사이의 관례임

self는 일단... 자바에서 this. 느낌인듯

행위들도 넣어보쟈

class 학생:
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
    
    def 총점(self):
        return self.korean + self.math + self.english + self.science

    def 평균(self):
        return self.총점()/4

    def 출력(self):
        print(self.name, self.총점(), self.평균(), sep="\t")

일단 함수 안에 속성이나 행위를 불러올때는 무조건 self.으로 시작해야된다는 거만 기억하면 된다고..ㅎㅎㅎ 이거를 원래 파일에서 객체를 만들었던 함수 대신 넣어보겠음

class 학생:
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
    
    def 총점(self):
        return self.korean + self.math + self.english + self.science

    def 평균(self):
        return self.총점()/4

    def 출력(self):
        print(self.name, self.총점(), self.평균(), sep="\t")

students = [
    학생("김윤서", 87, 98, 88, 95),
    학생("배서연", 92, 98, 96, 98),
    학생("백지민", 76, 96, 94, 90),
    학생("양다연", 98, 92, 96, 92),
    학생("이예진", 95, 98, 98, 98),
    학생("이주완", 64, 88, 92, 92)
]

print("이름", "총점", "평균", sep="\t")
for student in students:
    student.출력() 

이 코드를 분석해보면

일단 학생 class에는 학생의 이름, 국어 점수, 수학 점수, 영어 점수, 과학 점수 속성이 있고 총점과 평균을 구하는 행위, 출력하는 행위가 있음

__init__함수는 딱! 정해져있는 이름임 __init__함수는 받은 매개변수를 속성에 초기화시켜주는 '생성자'이걸랑요 만약에 __init__이 아니라 자기 맘대로 init 이런 식으로.. 써주면 안 됨

파이썬 클래스의 생성자 함수 이름은 __init__이다!!!!!!

이제 클래스를 벗어나 students 리스트로 가봅시당(총총)
첫줄을 보면

학생("김윤서", 87, 98, 88, 95)

학생 클래스를 호출하고 있음! 그리고 argument는 "김윤서", 87, 98, 88, 95인 상태. argument들이 __init__ 함수의 매개변수로 들어가게 되고 class 안에 있는 멤버 변수가 초기화됩니당
(생성자는 클래스를 호출하면 무조건 실행하기 때문에 그런 거!)

이제 출력문으로! 빠밤

print("이름", "총점", "평균", sep="\t")

이 출력문은 그냥 열 이름 알려주는 겅미

나는 개인적으로 여기서 살짝 흠짓했음

for student in students:
    student.출력()

..전혀 흠짓할만한 코드가 아닌뎅ㅋ
students 리스트 안에 객체가 6개가 있잔아요 그 객체 하나하나가 student에 들어가서 결국 student는 객체를 뜻하는 거임

김윤서.출력()
배서연.출력()
.
.
.

이게 !!!!올바른 코드는 아니지만!!!! 대충 이런 느낌으로 이해하면 됨

클래스 선언하기

class ClassName:
	pass

초반부에 클래스명은 다 캐멀케이스였다고 했던 거! 기억하고 있었어야됑~~ 클래스를 선언할때 클래스명은 캐멀케이스로 써주심 됩니당
class 선언하는 건 대충 저렇게 생겼음 위에서 맛보고 와서 아직까진ㅋ쉬움ㅋ

객체를 생성할때는 그냥

ClassName()

이렇게 클래스를 호출해주면 됨

생성자

..아앗 위에서 혼자 구글링하면서 __init__ 열심히 이해했었는데 클래스를 집중적으로 안 다뤘어서 걍 설명을 안 해주셨었던 건가봄ㅎㅎ
그러면 다시 한 번 공부!

생성자는 기본적으로

class ClassName:
	def __init__(self, 추가적인 매개변수):
    	pass

이렇게 생겼응! self는 필수필수~~~ 위에서도 말했지만 self가 아닌 다른 변수명을 써도 오류는 안 나지만 self라고 쓰는게 개발자들 사이의 <관례>니까 self라고 씁시당

소멸자

와.....나 진심 살면서 소멸자라는 단어는 첨 들어본다 넘 흥미진진!!!!! 소멸자는

	def __del__(self):
    	pass

이래이래 __del__임!! 소멸자는 말 그대로 객체를 소멸시켜주는 역할

클래스의 속성 선언하기

속성 선언 아주아주 간단함

class ClassName:
	def __init__(self):
    	self.속성1
        self.속성2

이런 식으로 생성자 안에

self.변수명 

해주심 돼~~~ 근데 대부분 매개변수로 초기화하는 경우가 대부분이라서

class ClassName:
	def __init__(self, 속성1, 속성2):
    	self.속성1 = 속성1
        self.속성2 = 속성2

요런 형태가 많습니당

클래스의 함수 선언하기

원래 클래스 안에 있는 함수는 메서드라고 불러야되는데 파이썬에서는 클래스 안에 있든 밖에 있든 다 함수라고 냅다 불러버린다고 함! C++도 함수랑 메서드 섞어서 쓴다며..~ㅋ 네넹 할튼 그래서 파이썬에서는 메서드를 함수라고 불러도 됨

이것두 위에서 하고 내려왔음ㅎ

class ClassName:
	def 함수명(self, 추가적인 매개변수):
    	pass

그냥 이렇게 해주면 되잖앗!!
그리고 파이썬 클래스에서 마지막으로 기억하고 넘어갈거!
속성이나 함수에 접근할땐 무 조 건 앞 에 self. 붙 이 고 접 근 하 자
..나란 놈... 백퍼 이거 잊어버릴 거 같아서 한 번 더 써봤어요미

특이한 이름의 함수()

언더바 언더바하면 생각나는 거! 방금 배운 생성자 함수가 생각나죠!
언더바 언더바로 시작하는 함수가 생성자 말고도 되게..되게 많음
그걸 좀 살펴봅시당

1.__str__()함수

class Student:
    def __str__(self):
        return "{} {}살".format(self.이름, self.나이)

    def __init__(self, 이름, 나이):
        print("객체가 생성되었습니다.")
        self.이름 = 이름
        self.나이 = 나이
    
    def __del__(self):
        print("객체가 소멸되었습니다.")

student = Student("백지민", 17)
print(str(student))

우선 실행되는 함수 순서는 생성자 => __str__() => 소멸자 순서!
만든 객체를 student 안에 넣고 그 student를 출력한 겅미
__str__() 함수는 str 자료형으로 바꿔서 return해주는 함수임
딱히 호출을 하지 않아도 객체를 만들면 실행이 되는 거 같음!
__str__() 함수가 아니라 뭐 다른 이름으로 만들어서 써도 되지만 걍 __str__() 함수가 개발자들이 많이 써왔어서 __str__() 쓰면 됨

2.크기 비교 함수 이름
-eq(equal) 같다
-ne(not equal) 다르다
-gt(greater than) 크다
-ge(greater than or equal) 크거나 같다
-lt(less than) 작다
-le(less than or equal) 작거나 같다

class Student:
    def __init__(self, 이름, 나이):
        self.이름 = 이름
        self.나이 = 나이
    
    def __eq__(self, other):
        print("eq() 함수")
    def __ne__(self, other):
        print("ne() 함수")
    def __gt__(self, other):
        print("gt() 함수")
    def __ge__(self, other):
        print("ge() 함수")
    def __lt__(self, other):
        print("le() 함수")
    def __le__(self, other):
        print("ge() 함수")

student = Student("백지민", 17)

student == student
student != student
student > student
student >= student
student < student
student <= student
#결과
eq() 함수
ne() 함수
gt() 함수
ge() 함수
le() 함수
ge() 함수

08-2 클래스의 추가적인 구문

프라이빗 변수

자바에서는 private을 붙이면 프라이빗 변수가 됐는데 파이썬에서는 언더바 2개를 써주면 프라이빗 변수가 됨!

__변수명 #프라이빗 변수

프라이빗 변수는 외부에서 접근이 불가능함!!
예시 코드

class Rect:
    def __init__(self, width, height):
        if width <= 0 or height <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width
        self.__height = height
    def get_area(self):
        return self.__width * self.__height

rect = Rect(10, 10)
print(rect.get_area())

만약에 class 밖에서

rect.width = -10

을 써도 전혀 영향을 안 줌! 똑같이 100이라는 결과가 나옵니다요

print(rect.__width)

#결과
Traceback (most recent call last):
  File "d:\python\혼공파\08-2_ex.py", line 11, in <module>
    print(rect.__width)
AttributeError: 'Rect' object has no attribute '__width'

..심지어 출력조차 안 됨 그래서 출력하고 싶으면 클래스 안에 width를 출력하는 함수를 따로 만들어야함!!

겟터 셋터

하지만... 밖에서 아예 접근이 안 되는게 또 불편햇던 과거의 개발자들은 겟터 셋터라는 함수를 만듭니당

class Rect:
    def __init__(self, width, height):
        if width <= 0 or height <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width
        self.__height = height
    def get_width():
        return self.__width
    def set_width(self, width):
        if width <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width
    def get_area(self):
        return self.__width * self.__height

rect = Rect(10, 10)
print(rect.__width)
print(rect.get_area())

위에서 말했던 출력하는 함수가 겟터 함수!가 되겠습니당 셋터 함수도 말 그대로 값을 넣어주는 함수애

그리고 여기서...더 나아갔다고 함!

Property

그것이 바로 Property

강사님왈
기본적인 속성: Attribute
어떤 처리를 해준 속성: Property

라고 생각하면 된다며!

class Rect:
    def __init__(self, width, height):
        if width <= 0 or height <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width
        self.__height = height

    @property
    def width(self):
        return self.__width

    @width.setter
    def width(self, width):
        if width <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width
    def get_area(self):
        return self.__width * self.__height

rect = Rect(10, 10)
rect.width += 10
print(rect.get_area())

property를 사용한 코드임!
property를 쓰면 class를 나와서도

rect.width += 10

이런 코드를 쓸 수가 있웅...ㄷ ㄷ 반영됨!

대놓고 비교하면

#before
	def get_width():
        return self.__width
        
    def set_width(self, width):
        if width <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width
        
#after
	@property
    def width(self):
        return self.__width

    @width.setter
    def width(self, width):
        if width <= 0:
            raise Exception("너비와 높이는 음수가 나올 수 없습니다.")
        self.__width = width

더 비교하면

#before
	def get_width():

#after
	@property #데코레이터
    def width(self):

이렇게 겟터 함수는 @property를 쓰고 get_을 지움!

#before
	def set_width(self, width):
#after
	@width.setter
    def width(self, width):

셋터 함수는 @변수명.setter를 쓰고 set_을 지워서 사용!

끄읏
혼공파 마무리 후기!!!!!!

profile
기록하고 싶은 내용들을 주로 올리고 있습니다

0개의 댓글