[AI] Python Object Oriented Programming

Madeline👩🏻‍💻·2022년 12월 8일
0

AI study

목록 보기
2/6

네이버 부스트코스 강의 <인공지능(AI) 기초다지기>를 참고하여 작성하였습니다.

파이썬 객체 지향 프로그래밍

0. 재사용?

만들어 놓은 코드를 어떻게 잘 구조화해야 용도에 맞게 재사용할 수 있을까?
=> 객체!

  • 객체 지향 언어(OOP, OO, Object-Oriented Programming)

    	-객체: 실생활에서 일종의 물건

    속성(Attribute)와 행동(Action)을 가진다.

    -속성 = 변수(variable), 행동 = 함수(method)로 표현

    -파이썬, 자바, C++, C#, ...

  • OOP는 설계도에 해당하는 클래스 Class,
    실제 구현체인 인스턴스 Instance로 나눈다.
    ex) 붕어빵 틀 = class
    붕어빵 = instance

1. class 구현하기 in Python

  • 축구 선수 정보를 Class로 구현

1) class 선언

(object는 python3에서 자동 상속)

class SoccerPlayer(object):

class: class 예약어
SoccerPlayer: class 이름
(object): 상속받는 객체명

⭕ Python naming rule

  • 변수, Class 명 함수명에 해당
    - snake_case: 띄어쓰기 부분에 " __ "를 추가
    - CamelCase: 띄어쓰기 부분에 대문자

2) attribute 추가하기

  • Attribute 추가는 init_, self와 함께
    => 객체 초기화 예약 함수

🎃 예제

class SoccerPlayer(object):
    #초기화
    def __init__(self, name, position, back_number):
        self.name = name
        self.position = position
        self.back_number = back_number

는 특수한 예약 함수나 변수, 함수명 변경(맨글링)으로 사용
ex)
main, add, str, eq__

🎃 예제

2. 구현 가능한 OOP 만들기 - 노트북

🎃 예제

1) 계획

  • 노트 정리 프로그램
  • 사용자가 노트에 text를 적을 수 있다.
  • note - content 생성, 제거
  • 두 개의 노트북을 합쳐 하나로 만들 수 있다.
  • note -> notebook에 삽입
  • notebook은 note가 삽입될 때 페이지를 생성하며, 최고 300페이지까지 저장 가능하다
  • 300 페이지가 넘으면 더 이상 노트 삽입x

우와 이거 코틀린으로도 만들어봐야겠따

-method
Notebook : add_note, remove_note, get_number_of_pages
Note : write_content, remove_all
-variable
Notebook : title, page_number, notes
Note : content

2) Note Class

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 "Note Content: %s" % \
            self.content

3) NoteBook Class

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("All pages are filled")
    def remove_note(self, page_number):
        if page_number in self.notes.keys():
            return self.notes.pop(page_number)
        else:
            print("Page not found")
    def get_number_of_pages(self):
        return len(self.notes.keys())

4) NoteBookProgram.py

  • 모듈에서 다시 다루겠지만, 앞서 썼던 클래스들을 import해준다.
  • 이것 저것 기능을 다뤄보았다.

2. 상속 (Inheritance)

  • 부모 클래스로부터 속성과 method를 물려받은 자식 클래스를 생성하는 것

class Person(object):
...

class Korean(Person):
...

=> Person의 속성을 Korean이 그대로 사용할 수 있음.

저 object는 기본값으로 비워놔도 됨. 자동으로 상속받는 기본 클래스!

🎃 예제

🎃 예제 - 좀 더 구체적인 예제!

3. 다형성 (Polymorphism)

  • 같은 이름 메소드의 내부 로직을 다르게 생성한다.
  • 같은 부모 클래스의 상속에서 주로 발생한다.

🎃 예제

4. 가시성 (Visibility)

  • 객체의 정보를 볼 수 있는 레벨 조절
  • 누구나 객체 안에 모든 변수를 볼 필요 없음

    => 쉽게 접근할 수 없게 막아놓는 기능

이런 경우에 사용한다!
1) 객체를 사용하는 사용자가 임의로 정보 수정
2) 필요 없는 정보는 접근할 필요 없음
3) 제품으로 판매하는 경우 - 소스 보호

🎁 상식) Encapsulation

: 캡슐화 / 정보 은닉

  • 클래스를 설계할 때, 클래스 간 간섭 / 정보 공유의 최소화
  • 캡슐을 던지듯, 인터페이스만 알아서 써야한다.

🎃 예제 1.

  • Product 객체를 Inventory 객체에 추가

  • Inventory에는 오직 Product 객체만 들어감

  • Inventory에 Product가 몇 개인지 확인 필요

  • Inventory에 Product items는 직접 접근 X

  • 우선 items를 기본 변수로 선언해보자!

주석으로 달아놓은 것처럼
private 변수로 선언해야 타 객체가 접근할 수 없게 된다.

  • 바꿔보자!

접근이 안된다!
개념적으로 언더바2개로 시작하는 private 변수들은
다른 객체에서 마음대로 변경할 수 없게 할 수 있다.

🎃 예제 2.

  • Product 객체를 Inventory 객체에 추가
  • Inventory에는 오직 Product 객체만 들어감
  • Inventory에 Product가 몇 개인지 확인 필요
  • Inventory에 Product items는 직접 접근 O!!

 @property ### => property decorator
    #숨겨진 변수를 반환
    def items(self):
        return self.__items

@property decorator로 함수를 변수처럼 호출할 수 있다.

5. Decorate

앞에서 사용해본 property도 데코레이터 중 하나이다.

🎨 알아야 할 개념 3가지

1. first - class object
: 일등 함수 / 일급 객체
- 변수, 데이터 구조에 할당 가능한 객체
- parameter로 전달, return 값으로 사용 가능
=> 파이썬의 함수들은 다 일급 함수이다.
함수가 파라미터로 쓰이기 때문!
ex) map(f, ex) : f가 함수였어

def square(x):
	return x*x

f = square
f(5)
#########################
def cube(x):
	return x*x*x    
def formula(method, argument_list):
	return [method(value) for value in argument_list]

=> 함수를 파라메터로 사용

2. inner function
: 함수 내에 또 다른 함수 존재
1) 기본

def print_msg(msg):
	def printer():
    	print(msg)
    printer()
print_msg("Hi")

2) closures: inner function을 return 값으로 반환하는 경우

def print_msg(msg):
	def printer():
    	print(msg)
    return printer()
   
another = print_msg("Hi")
another()

=> another는 항상 메세지에 print_msg가 리턴된다.
이렇게 사용하면 좋은 점:

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")
p_func = tag_func('p', "Data Academy")

3.decorator function
:복잡한 클로져 함수를 간단하게!

profile
Major interest in iOS 🍀 & 🍎

0개의 댓글