python_oop

이상민·2023년 3월 5일
0
post-custom-banner

1.1 object_oriented_programming

객체지향이란 어떠한 물체의 고유한 특징을 추출(추상화)하는 것을 의미한다. 객체라는 개념을 이용하여 사람이 생각하는 방식과 가깝게 프로그래밍을 할 수 있게되었다.

  • class: 설계도
  • instance: 구현체,객체

1.2 oop implementation Example

아래의 조건을 만족하는 노트정리 프로그램을 객체지향프로그래밍으로 만들어보자.

  • 사용자는 노트에 뭔가를 적을 수 있다.
  • 노트에는 content:str이 있고, 내용 제거(remove)가 가능하다.
  • 두개의 노트북을 합쳐 하나의 노트로 만들 수 있다.
  • 노트는 note book에 삽입할 수 있다, 노트는 최대 300페이지까지 저장가능


Note Class

class Note(object): #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

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):#note: note 객체
       	if self.page_number < 300:
          self.notes[self.page_number] = 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("해당 페이지는 존재하지 않습니다.")

2.1 oop characteristics

객체 지향 프로그래밍을 위해서는 아래 세가지 특성들이 필요하다.

  • Inheritance(상속):부모클래스로 부터 속성과 method를 물려받은 자식 클래스를 생성하는 것
    #부모클래스
    class Person(object):
    	def __init__(self,name,age,gender):
       		self.name = name
            self.age = age
            self.gender = gender
        def about_me(self):
        	print("저의 이름은",self.name,"이구요, 제 나이는",str(self.age),"살 입니다.")
    #자식 클래스
    class Employee(Person):
        def __init__(self, name,age, gender, salary,hire_data):
            super().__init__(name, age, gender) # 부모객체 사용
            self.salary = slary
            self.hire_date = hire_date 
        def do_work(self):
            print("열심히 일을 합니다.")
        def about_me(self): # 부모클래스 함수 재정의
            super().about_me() # 부모클래스 함수 사용
            print("제급여는",self.salary,"원입니다.") #기능 추가
  • polymorphism(다형성): 같은 이름을 갖는 메소드들의 내부 로직을 다르게 작성.

  • visibility (가시성): 객체의 정보를 볼 수 있는 레벨을 조절하는 것. 사용자가 임의로 접근,수정하지 않도록한다.

class test():
    def __init__(self):
        self.__items = [] #_를 두개 붙이면 private 변수로 선언되어 사용자가 접근할 수 없다.
그러나 데코레이터를 이용하면 클래스 외부에서 숨겨진 변수를 호출할 수 있다.
class test():
    def __init__(self):
        self.__items = [] 사용자가 접근할 수 없다.
    @property
    def items(self):
        return self.__items #원본 객체를 반환하면 사용자가 수정할 수 있으므로 	copy를 사용하여 반환하는 것이 바람직하다
my_test = test()
items = my_test.items #property를 사용하면 호출시 괄호 생략가능

decorator 추가 설명

데코레이터를 이해하기 위해 추가적인 개념이 필요하다.

  • first-class objects(일급함수): 변수나 데이터 구조에 할당이 가능한 객체. 파이썬의 함수들은 일급함수.
#case 1
def squares(X):
    return x*x
f = square #함수를 변수에 할당
f(5) #25

f = lambda x: 2*x
f(5) # 10

#case 2
def func(method,ex): #함수이름을 파라미터로 받는다
    return [method(value) for value in ex]

실행결과

******************************
Hello
******************************
profile
잘하자
post-custom-banner

0개의 댓글