글을 시작하며..
학교에서 전공 수업도 듣고 파이썬으로 프로젝트, 회사에서 일도 하면서 파이썬을 다 안다고 생각하던 나 자신이 창피해지는 일주일...
AI Tech를 진행하면서 정말 짧은 시간안에 Python을 이렇게 제대로 공부하는 건 너무 좋은 거 같다.
- Obeject-Oriented Programming, OOP
- 객체 : 실생활에서 일종의 물건. 속성(Attribute)와 행동(Action)을 가짐
- OOP는 이러한 객체 개념을 프로그램으로 표현. 속성은 변수(variable), 행동은 함수(method)로 표현됨
- 파이썬 역시 객체 지향 프로그램 언어
class 선언하기
- class 선언, object는 python3에서 자동 상속
class SoccerPlayer(object):
#object는 python3에서는 자동 상속
class SoccerPlayer():
python naming rule
- 변수와 Class명 함수명은 짓는 방식이 존재
- snake_case : 띄어쓰기 부분에 "_"를 추가. 뱀처럼 늘여쓰기, 파이썬 함수, 변수명에 사용
- CamelCase : 띄워쓰기 부분에 대문자. 낙타의 등 모양, 파이썬 Class명에 사용.
Attribute 추가는 __init__, self와 함께
__init__은 객체 초기화 예약함수
파이썬에서 __의미
- __ 는 특수한 예약 함수나 변수 그리고 함수명 변경(맨글링)으로 사용
- ex : __main__, __add__, __str__, __eq__
- 참고사이트
method(Action)추가는 기존 함수와 같으나, 반드시 self를 추가애야만 class 함수로 인정됨.
클래스에서 self는 생성된 instance를 의미함.
class SoccerPlyer():
def __init__(self, name:str, postion: str, back_number:int):
self.name = name
self.position = position
self.back_number = back_number
def change_back_number(self, new_number):
print("선수의 등번호를 변경합니다. : From {} to {}".format(self.back_number, new_number))
self.back_number = new_number
# Object 이름 선언과 함께 초기값 입력하기
park = SoccerPlayer("park", "MF", 10)
# 객체명 = Class명(__init__함수 Interface, 초기값)
OOP에 필요한 것 : Inheritance(상속), Polymorphism(다형성), Visibility(가시성)
상속(Ingeritance)
- 부모클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성 하는 것.
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
class Korean(Person):
pass
first_korean = Korean("Sungchul", 35)
print(first_korean.name)
class Person(object): # 부모 클래스 Person 선언
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def about_me(self): # Method 선언
print("저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살
입니다.")
class Employee(Person): # 부모 클래스 Person으로 부터 상속
def __init__(self, name, age, gender, salary, hire_date):
super().__init__(name, age, gender) # 부모객체 사용
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,
" 입니다.")
다형성(Polymorphism)
- 같은 이름 메소드의 내부 로직을 다르게 작성
- Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함.
- 중요한 OOP의 개념 그러나 너무 깊이 알 필요 X
가시성(Visibility)
- 객체의 정보를 볼 수 있는 레벨을 조절하는 것
- 누구나 객체 안에 모든 변수를 볼 필요가 없음
- 객체를 사용하는 사용자가 임의로 정보 수정
- 필요 없는 정보에는 접근 할 필요가 없음
- 만약 제품으로 판매한다면? 소스의 보호
Encapsulation
- 캡슐화 또는 정보 은닉(Information Hiding)
- Class를 설계할 때, 클래스 간 간섭/정보공유의 최소화
- 캡슐을 던지듯, 인터페이스만 알아서 써야함
self.__items : 앞에 __가 붙으면 Private 변수로 선언하여 타객체가 접근못하게 만듬.
접근허용을 해서 사용 할 수 있게도 함.
class Product(object):
pass
class Inventory(object):
def __init__(self):
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)
@property
def items(self):
return self.__items
my_inventory = Inventory()
my_inventory.add_new_item(Product())
print(my_inventory.__items) # error
print(my_inventory.items)
decorate
first-class objects
- 일등함수 또는 일급 객체
- 변수나 데이터 구조에 할당이 가능한 객체
- 파라메터로 전달이 가능 + 리턴 값으로 사용
- 파이썬의 함수는 일급함수
Inner function
- 함수 내에 또 다른 함수가 존재
- 흔하며 많이 나옴
- closures : inner function을 return값으로 반환(자바스크립트에서 많이 나오는 개념)
decorator function
def star(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
print("*" * 30)
return inner
@star
def printer(msg):
print(msg)
printer("Hello")
# star(func)에서 func에 printer가 들어가고
# printer(msg)에서 msg에 Hello가 들어가는 형태
def test1(num1):
def test2(num2):
def inner(*args):
result = num2(*args) * 10
return [num1, result]
return inner
return test2
@test1(2)
def chk(n):
return n ** 2
print(chk(3)) # [2, 90]
# test1의 num1에 2
# test2의 num2에 chk(3)
# inner의 *args에 chk의 파라미터인 n
# result = num2(*args) * 10 -> chk(3) * 10 -> 9 * 10 -> 90
# return = [2,90]