강의 복습 내용
- 객체 지향이란
- 객체 지향 개념, 특징(상속성,다형성,가시성)
- 클로져와 decorator
- 모듈과 패키지의 형태
- 여러 소스에 맞는 환경을 위한 가상환경 구축법
- 더블언더스코어와 맨글링(mangling)
얻은 지식
- 기본적인 객체 지향 지식
- 모듈과 패키지를 구성하는 방식
- 더블언더스코어와 언더스코어의 의미
객체 지향 프로그래밍
- object-oriented programming
- 객체란
속성
,행동
을 가지는것- 속성은 변수(variable), 행동은 함수(method)로 표현된다.
- 클래스class란
- 일종의 설계도
- 실제 구현체는 instance
객체 예시
- class 선언
# class 클래스명(상속받는 객체명): # object는 기본객체로 생략해도 된다. class SoccerPlayer(object): # a = SoccerPlayer(name,position,back_number)로 초기화 수행 def __init__(self,name,position,back_number)#초기화 예약 함수 self.name = name # 받아온 값으로 객체 속성 초기화 # 메소드 선언 a.chage_back_number로 수행 def change_back_number(self,new_number): self.back_number = new_number
- 클래스명은 snake_case보다는 CamelCase를 사용
- 초기화는
__init__
과self
로 진행
OOP 특징
-
상속inheritance, 다형성polymorphism, 가시성visibility
- inheritance 상속
- 부모클래스로부터 속성, method를 상속받는것
class Persion: def __init__(self,name): self.name = name def me(self): print(f"나는 {self.name}이다.") class Employee(Persion):# Person을 상속 def __init__(self, name,salary): super().__init__(name) # 부모의 초기화를 따로 지정 #salary는 Employee의 속성 self.salary = salary def me(slef): # 부모의 me를 재정의 가능 super().me() # 부모의 me를 가져와서 수행하는것도 가능 print(f"월급은{self.salary}")
- 부모클래스로부터 속성, method를 상속받는것
- polymorphism 다형성
- 같은 이름의 메소드의 내부 로직을 다르게 작성
```python
class Animal:
def init(self,name):
self.name = name
def talk(self):
raise NotImplementedError(“상속”)
class Dog(Animal):
def talk(self):
return “월” class Cat(Animal): def talk(self): return “냥”
#같은 부모를 상속하여 같은 메소드를 쓰더라도 #다른게 작동되게 구현함 ```
- 같은 이름의 메소드의 내부 로직을 다르게 작성
```python
class Animal:
def init(self,name):
self.name = name
def talk(self):
raise NotImplementedError(“상속”)
class Dog(Animal):
def talk(self):
- visibility 가시성
- 객체의 정보를 볼 수 있는 레벨을 조절하는
- 특정 정보를 직접적으로 값을 변경하지 못하게 하는것처럼(캡슐화 encapsulation)
def __init__(self): self.__items = [] # 외부에서는 접근이 불가하게됨 - 맹글링 #__items를 외부에서 사용하고 싶다면 @property # 함수를 변수명처럼 쓰게 해준다. def items(self): # 일반적으로 그대로 주기보단 copy한 것을 return하여 원본을 보호한다. return self.__itmes
OOP개념
- first-class objects
- 변수나 데이터 구조에 할당이 가능한 객체
- 함수를 변수처럼 할당이 가능한거
- 파이썬은 1급함수
def a(x):
return x+x
b=a # 이렇게 넘겨줄 수 있다.
b(1)
- inner function
- 함수 내에 또다른 함수가 존재
def c(s):
def tc():
print(s)
tc()
# 클로져도 구현이 가능하다.
def c(s):
def tc():
print(s)
return tc
(복잡)decorator
- 복잡한 클로져 함수를 간단하게 해준다.
# 간단 함수 설명
def star(func):#star는 함수func를 받는다.
def inner(*args,**kwargs): # inner는 받은 func를 *들 사이에 넣어준다.
print("*"*30)
func(*args,**kwargs)
print("*"*30)
return inner #inner를 반환한다.
# star(func)같은 효과를 가진다.
@star
def printer(msg):#이거 자체를 star에 argument로 사용된다.
print(msg)
# 사용시에는 그냥 printer지만
printer("hello")
#결과
# ******************************
# hello
# ******************************
- 이중으로 사용이 가능하다.
##### 이중으로 사용도 가능하다.
def percent(func):
def inner(*args,**kwargs):
print("%"*30)
func(*args,**kwargs)
print("%"*30)
return inner
# star(percent(printer))와 같은 효과
@star
@percent
def printer(msg):
print(msg)
printer("hi")
#결과
# ******************************
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# hello
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# ******************************
- 좀더 복잡하지만 인자(exponent)를 넣어줄수 있다.
def gen(exponent): # exponent에는 2가 들어간다.
def wrapper(f): # f에는 raise_two가 들어간다.
def inner(*args) # *args에는 n의 값이 들어간다.
result = f(*args)
return exponent ** result
return inner
return wrapper #inner를 반환한다.
@gen(2) #exponent라는 인자를 먼저 등록한다.
def raise_two(n):
return n**2
print(raise_two(7))
# 2 ** (7 ** 2)
# 2^49
모듈, 패키지, 프로젝트
- 파이썬은 대부분 다른 사용자에 의해 구현되어 있다고 한다.
- 이런 모듈들은 객체형식으로 되어있어 끌어와서 사용한다.
- 어떻게 사용하는 알아보자.
모듈
.py
로 되어있는 하나의 파이썬 파일- 가져오기
- 별칭으로 가져오기
import fah_converter as fah
- 특정 함수,클래스만 호출
from fah_converter import convert_c_to_f
- 모든함수, 클래스 호출
from fah_converter import *
- built-in modules
- 파이썬이 제공하는 기본 라이브러리
패키지
- 하나의 대형 프로젝트를 만드는 코드의 묶음
- 모듈들의 합으로, 폴더단위
- 각 폴더마다
__init__.py
파일이 존재해야함(3.3이후는 없어도 인식)- from과 import로 사용 가능
from 폴더이름 import 파일이름
이런 형식으로 폴더내의 파일을 접근- 하위폴더와 파일을 모두 포함하게 된다.
__init__.py
에는 무엇이 들어가나.
# __init__.py에 들어가는 내용
__all__ = ["image","sound","stage"]
# 해당 폴더에서 사용하는 내부의 파일 or 폴더의 이름을 선언한다.
from . import image
from . import sound
from . import stage
- 최상단의 루트 폴더에
__main__.py
로 전체 패키지 실행- 실행시
python 루트폴더명
을 하면__main__.py
가 실행되게 된다.
- 실행시
# __main__.py 내용
from sound import echo
# sound폴더의 echo파일을 사용
if __name__ == "__main__":
print(echo.echo_play())
# echo의 echo_play()라는 함수를 수행하여 출력
가상환경 설정
- 여러 프로젝트를 하다보면 환경이 달라서 충돌이 날 수 있다.
- 새롭게 파이썬 환경을 구축하는것
도구
- virtualenv + pip
- 가장 대표적인도구
- conda
- 좀더 편리
- windows에서 장점
가상환경 구축
- 구축
conda create -n my_project python=3.8
conda create -n 가상환경이름 파이썬버전
- 호출
conda actibate my_project
- 해제
conda deactivate
기타 팁
더블 언더 스코어 , 맨글링 , 언더스코어
- 참고
- 특수한 예약 함수나 변수
__main__,__add__,__str__,__eq__
- 함수명 변경(맨글링)으로 사용
- 맨글링 참고
self.__items = [] # 외부에서는 접근이 불가하게됨
- class선언시 사용하면 쓰면 편리하게 사용이 가능하다.
_
하나는 따로 접근하지 않게, 가독성을 위해 사용하기도 함- 메모리관련해서도 좋다는 의견
for _ in range(100)
class SoccerPlayer(object):
def __init__(self,name,position,back_number)
self.name = name
self.__private = [] # 외부에서 직접적인 접근이 불가하게됨
# + 할때 수행
# SoccerPlayer객체인 a,b에 대해 a+b시 __add__를 수행하게 된다.
def __add__(self,other):
return self.name + other.name
# print할때 수행
# SoccerPlayer객체인 a에 대해 print(a)시 __str__를 수행하게 된다.
def __str__(self):
return f"정보{self.name}"
split관련
ex_str.strip('_').split('_')
#앞뒤로 중복된 _들을 제거해준다.
#replace로 제거하기도한다.
ex_str.replace('_')
피어세션 정리
- 데코레이터
- 다른 언어에서는 함수를 합치는 의미로 쓰이기도 한다고함
- factorization
- 통계 분해해서 특징을 찾아내는거, 잠재요인
- 인수분해
- 딥러닝 관련 용어 정리가 필요하다.
- 논문보다는 용어의 기본 지식이 필요하다.
- 책 추천
- 모두를 위한 딥러닝
- 밑바닥 부터 시작하는 딥러닝
- cs 231n 강의
- 간단한 회고
과제후기
- 문자열과 list를 다루는 문제를 주로 하고 있다.
- 정규식 없이 python내부적으로 구현하는지가 궁금하다.
- 기본적으로 정규식을 사용하면 되지만…
- 예를 들면 특정 단어가 포함되는지 확인하는데 정규식말고 다른 방법이 있을지?
a in ["a","b"]
이런식으로 반복문을 사용하는거 뿐인지?
- 여러 공백이 있는것을 하나의 공백으로 어떻게 처리할까?
- split이후 다시 join하기로 진행함
회고
- 아직 1주차도 지나지 않는 목요일이 되었다.
- 이번주는 파이썬의 기초와 과제를 진행하는 방식을 맛보는 단계라고 생각한다.
- 과제를 하면서 현재는 큰 어려움이 없지만 테스트하는 방식들이 손에 익지 않았다.
- 이제 점차 ai관련 모듈도 진행하면서 ai지식을 동시에 진행되서 시간이 빡빡할듯 하다.