본문 바로가기
Data Science/Boostcourse_coachingstudy

Python Object Oriented Programming

by 루크 Luke 2022. 1. 24.
반응형

객체 지향 프로그래밍 언어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

댓글