객체 지향 프로그래밍 언어, Object Oriented Programming(OOP)
- 객체 : 실생활에서 일종의 물건 - 속성(Attribute), 행동(Action)을 가짐
- OOP는 이러한 객체 개념을 프로그램으로 표현
- 속성은 변수(Variable), 행동은 함수(Method)로 표현됨
- 파이썬 역시 객체 지향 프로그램 언어
- 인공지능 축구 프로그램을 작성한다고 가정하면
- Object는 팀, 선수, 심판, 공
- Action은 선수가 공을 차다, 패스하다
- Attribute는 선수의 이름, 포지션, 소속팀
- OOP는 설계도에 해당하는 클래스(Class)와 실제 구현체인 인스턴스(Instance)로 나뉨
Objects in Python
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
def change_back_number(self, new_number):
print('선수의 등번호를 변경합니다 : From %d to %d %(self.back_number, new_number)')
self.back_number = new_number
- class SoccerPlayer(object):
→ class 예약어, 상속받는 객체명은 object
- 속성 추가는 __init__, self로 함
- __init__는 객체 초기화 예약 함수임
- def __init__(self, name, position, back_number):
→ 객체는 파라미터로 넣어주면 된다. name, position, back_number
- __의 의미 : 특수한 예약 함수, 변수, 그리고 함수명 변경(맨글링)으로 사용
- __str__은 출력해주게끔 해주는 것
- __add__는 더해주는 것
- 참고 https://corikachu.github.io/articles/python/python-magic-method
- def change_back_number(self, new_number): method 구현
- 기존 함수와 동일하지만, 반드시 self를 추가해야만 class의 함수로 인정받을 수 있음
- object 사용하기 - 이름 선언과 함께 초기값 입력하기
- jinhyun = SoccerPlayer("Jinhyun", "MF", 10) : "Jinhyun", "MF", 10이 각각 초깃값으로 셋팅되면서 내부에 저장
- self? 생성된 instance라고 생각하면 됨
- jinhyun이라는 인스턴스(object)가 생성되는데, self가 바로 jinhyun이라고 생각하면 된다.
OOP Implement
Notebook | Note | |
method | add_note remove_note get_number_of_pages |
write_content remove_all |
variable | title page_number notes |
content |
class Note(object):
def __init__(self, content=None):
self.content = content
def write_content(self, content):
self.content = content
def remove_all(self):
self.content = ""
def __add__(self, other):
return self.content + other.content
def __str__(self):
return self.content
class Notebook(object):
def __init__(self, title):
self.title = title
self.page_number = 1
self.notes = {}
def add_note(self, note, page=0):
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):
if page_number in self.notes.keys():
return self.notes.pop(page_number)
else:
print("해당 페이지는 존재하지 않습니다.")
def get_number_of_pages(self):
return len(self.notes.keys())
OOP characteristics
- OOP = 실제 세상을 모델링하는 것!
- Inheritance, Polymorphism, Visibility
1) Inheritance(상속) : 부모클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것
- class Korean(Person): Person 클래스의 것들을 Korean 클래스가 상속받아서 그대로 사용
- super().__init__(name, age, gender) : 부모 클래스(super)가 가지고 있는 속성(name, age, gender)를 가져옴
2) Polymorphism(다형성) : 같은 이름 메소드의 내부 로직을 다르게 작성
- Dynamic Typing 특성으로 인해, 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함
- 중요한 OOP의 개념이지만 너무 깊이는 알 필요 없음.
- 개념적으로는 같은 일을 하는데, 세부적으로는 다르게 일함.
- 부모에게 존재하는 함수를 자식이 쓰고 싶은데, 좀 다르게 바꾸고 싶을 때 발생하는 것
3) Visibility(가시성) : 객체의 정보를 볼 수 있는 레벨을 조절하는 것
- 누구나 객체 안에 모든 변수를 볼 필요가 없음
- 객체를 사용하는 사용자가 임의로 정보를 수정
- 필요 없는 정보에는 접근 할 필요가 없음
- 만약 제품으로 판매한다면? 소스의 보호
- Encapsulation : 캡슐화, 정보 은닉 - 클래스 설계 시에 클래스 간 간섭/정보공유의 최소화, 인터페이스만 알아서 써야함
- __items : private 변수로 선언해서, 타 객체가 접근하지 못하도록 함
- 접근 허용 : @property def items(self): return self, items - property decorator
Decorator
- First-class objects : 일등함수, 또는 일급 객체, 변수나 데이터 구조에 할당이 가능한 객체, 파라미터로 전달 가능, 리턴 값으로 사용
- 파이썬의 함수는 First-class ex) map(f, list)
- 함수 자체를 변수로, 파라미터로 전달해서 던질 수 있음
def square(x):
return x * x
f = square
f(5)
# 25
def square(x):
return x * x
def cube(x):
return x*x*x
def formula(method, argument_list):
return [method(value) for value in argument_list]
- Inner Function : 함수 내에 또 다른 함수가 존재
- closures : inner function을 return 값으로 반환
def tag_func(tag, text):
text = text
tag = tag
def inner_func():
return '<{0}>{1}<{0}>'.format(tag, text)
return inner_func
h1_func = tag_func('title', 'this is python class')
p_func = tag_func('p', 'data academy')
- decorator function은 복잡한 클로져 함수를 간단하게!
def star(func):
def inner(*args, **kwargs):
print('*' * 30)
func(*args, **kwargs)
print('*' * 30)
return inner
@star #decorator
def printer(msg):
print(msg)
printer('hello')
# *******************
# Hello
# *******************
References
'Data Science > Boostcourse_coachingstudy' 카테고리의 다른 글
Pythonic code (0) | 2022.01.24 |
---|---|
Python Data Structure (0) | 2022.01.17 |
String and advanced function concept (0) | 2022.01.17 |
Conditionals and Loops (0) | 2022.01.14 |
Function and Console I/O (0) | 2022.01.14 |
댓글