- 객체 지향 프로그래밍 언어, Object Oriented Programming(OOP)에 대해서 배운다.
- OOP는 프로그래밍 언어를 배우는 데 있어서 매우 중요한 개념이다.
- 파이썬 자체도 OOP 형태로 구성되어 있기도 하지만, 파이썬 나오기 전에 대세 언어들이였던 자바, C++, C# 같은 언어들이 모두 OOP 기반의 언어들이다.
- OOP를 배우는 것은 이전에 우리가 if 문이나 고난이도 프로그래밍을 위한 길로 생각하고 이번 챕터를 공부해보자.
클래스와 객체 (객체 지향 언어의 이해)
객체 종류 | Action | Attribute |
---|---|---|
팀, 선수, 심판, 공 | 선수 - 공을 차다, 패스하다 | 선수 - 선수 이름, 포지션, 소속팀 |
심판 - 휘슬을 불다, 경고를 주다 | 팀 - 팀 이름, 팀 연고지, 팀 소속 선수 |
#class예약어 class이름 상속받는 객체명
class SoccerPlayer(object):
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
파이썬에서 __ 의미
method 구현하기
class SoccerPlayer(object):
def change_back_number(self, new_number):
print("선수의 등번호를 변경합니다 :
From %d to %d" % \
(self.back_number, new_number))
self.back_number = new_number
tmp = SoccerPlayer('Jinhyun', 'MF', 10)
# tmp는 class코드안에서 self 라고 불리고 코드 밖에서는 자기 변수명 tmp로 불린다.
Class : Notebook | Class : Notebook | ||
---|---|---|---|
method | variable | method | variable |
add_note | title | write_content | content |
remove_note | page_number | remove_all | |
get_number_of_pages |
# Note class
class Note(object):
def __init__(self, content = None): # variable = content
self.content = content
def write_content(self, content): # write_content
self.content = content
def remove_all(self): # remove_all
self.content = ""
def __add__(self, other):
return self.content + other.content
def __str__(self):
return self.content
# NoteBook class
class NoteBook(object):
def __init__(self, title): # variables = title, page_number, notes
self.title = title
self.page_number = 1
self.notes = {}
def add_note(self, note, page = 0): # add_note
if self.page_number < 300:
if page == 0:
self.notes[self.page_number] = note
self.page_number += 1
else:
self.notes = {page : note}
self.page_number += 1
else:
print("Page가 모두 채워졌습니다.")
def remove_note(self, page_number): # remove_note
if page_number in self.notes.keys():
return self.notes.pop(page_number)
else:
print("해당 페이지는 존재하지 않습니다")
def get_number_of_pages(self): # get_number_of_pages
return len(self.notes.keys())
# 부모 클래스
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.gender = gender
def about_me(self): # Method 선언
return '저의 이름은.' self.name, '이구요, 제 나이는 ', str(self.age), '살 입니다.')
def __str__(self):
return '저의 이름은 {0} 입니다. 나이는 {1} 입니다". format(self.name, self.age)
class Employee(Person): # 부모 클래스 Person으로 부터 상속
def __init__(self, name, age, gender, salary, hire_date):
super().__init__(name, age, gender) # 부모객체 사용. super는 자기자신의 부모클래스. 즉, Person의 속성을 불러온다.
self.salary = salary
self.hire_date = hire_date # 속성값 추가
def do_work(self): # 새로운 메서드 추가
print("열심히 일을 합니다.")
def about_me(self): # 부모 클래스 함수 재정의
super().about_me() # 부모 클래스 함수 사용
print("제 급여는 ", self.salary, "원 이구요, 제 입사일은 ", self.hire_date, " 입니다.")
class Product(object):
pass
class Inventory(object):
def __init__(self):
self.__items = [] # __ = Private 변수로 선언! 타객체가 접근 못함 (items 변수는 외부에서 접근을 하지 못함)
def add_new_item(self, product):
if type(product) == Product:
self.__items.append(product)
print("new item added")
else:
raise ValueError("Invalid Item")
def get_number_of_items(self):
return len(self.__items)
class Inventory(object):
def __init__(self):
self.__items = []
# items를 외부에서는 접근불가. 내부에서는 접근이 가능해지면서 반환 가능
@property # property decorator 숨겨진 변수를 반환하게 해줌
def items(self):
return self.__items
def add_new_item(self, product):
if type(product) == Product:
self.__items.append(product)
print("new item added")
else:
raise ValueError("Invalid Item")
def get_number_of_items(self):
return len(self.__items)
my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
print(my_inventory.get_number_of_items())
items = my_inventory.items # property decorator로 함수를 변수처럼 호출
items.append(Product())
print(my_inventory.get_number_of_items())
이해하기 위한 개념들
def square(x):
return x*x
f = square # 함수를 변수로 사용가능
f(5)
list(map(f, [5,2])) # parameter로 전달이 가능
def print_msg(msg):
def printer(): # 함수 내에 또 다른 함수 존재
print(msg)
return printer # printer 함수 자체를 return 받는다 (closures)
another = print_msg('Hello, Python')
another() # printer 함수 그 자체다.
## example 1)
def star(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
print("*" * 30)
return inner
def percent(func):
def inner(*args, **kwargs):
print("%" * 30)
func(*args, **kwargs)
print("%" * 30)
return inner
@star
@percent
def printer(msg):
print(msg)
printer("Hello")
# 리턴값 =
# ******************************
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Hello
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# ******************************
# 위에 데코레이터는 아래처럼 동작한다
def star(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
print("*" * 30)
return inner
def percent(func):
def inner(*args, **kwargs):
print("%" * 30)
func(*args, **kwargs)
print("%" * 30)
return inner
def printer(msg):
print(msg)
printer = star(percent(printer))
printer("Hello")
## example 2)
def generate_power(exponent):
def wrapper(f):
def inner(*args):
result = f(*args)
return exponent**result
return inner
return wrapper
@generate_power(2)
def raise_two(n):
return n**2
print(raise_two(7)) # 562949953421312
# 위에 데코레이터는 아래와 같이 동작
def generate_power(exponent):
def wrapper(f):
def inner(*args):
result = f(*args)
return exponent**result
return inner
return wrapper
def raise_two(n):
return n**2
raise_two = generate_power(2)(raise_two)
raise_two(7) # 562949953421312
- 파이썬 프로젝트의 기본이 되는 모듈과 패키지, 그리고 프로젝트의 개념에 대해서 배운다.
모듈 overview
모듈 만들기
파이썬의 Module == py 파일을 의미
같은 폴더에 Module에 해당하는 .py파일과 사용하는 .py을 저장한 후
import 문을 사용해서 module을 호출
패키지
패키지 만들기
두 개의 프로젝트 웹과 데이터 분석 패키지는 둘다 설치?
가상환경 설정하기 (Virtual Environment)
virtualenv + pip | conda |
---|---|
가장 대표 적인 가상환경 관리 도구 | 사용 가상환경 도구. miniconda 기본 도구 |
레퍼런스 + 패키지 개수 | 설치의 용이성. Windows에서 장점 |
conda 가상환경
패키지 설치
tqdm 패키지