축구 선수 정보 class로 구현¶
In [1]:
class SoccerPlayer(object):
def __init__(self, name : str, position : str, back_number : int):
self.name = name
self.position = position
self.back_number = back_number
# 반드시 self 를 추가해야만 class 함수로 인정됨
def change_back_number(self, new_number):
print(f"change number from {self.back_number} to {new_number}")
self.back_number = new_number
# 인스턴스 print 할때 __str__ 매서드 사용
def __str__(self):
return(f"{self.name} {self.position} {self.back_number}")
# taeho + part 가능
def __add__(self, other):
return self.name + other.name
# 다양한 매직 매소드들 - https://corikachu.github.io/articles/python/python-magic-method
# self는 생성된 인스턴스 자신
In [9]:
taeho = SoccerPlayer("taeho", "MF", 10)
park = SoccerPlayer("park", "WF",9)
print(taeho)
# taeho.back_number = 15 로도 가능한데, 함수로 바뀌는 것 권장.
taeho.change_back_number(15)
print(taeho)
print(park + taeho)
taeho MF 10
change number from 10 to 15
taeho MF 15
parktaeho
OOP Implementation Example¶
- Note를 정리하는 프로그램
- 사용자는 Note에 뭔가를 적을 수 있다.
- Note에는 Content가 있고, 내용을 제거할 수 있다.
- 두 개의 노트북을 합쳐 하나로 만들 수 있다.
- Note는 Notebook에 삽입된다.
- Notebook은 Note가 삽일 될 때 페이지를 생성하며, 최고 300페이지까지 저장 가능하다
- 300 페이지가 넘으면 더 이상 노트를 삽입하지 못한다.
Notebook | Note | |
---|---|---|
method | add_note</br>remove_note</br>get_number_of_pages | write_contents</br>remove_all |
variables | title</br>page_number</br>notes | content |
In [38]:
class Note:
def __init__(self, content):
self.content = content
def write_contents(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
In [73]:
class Notebook:
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 print_notes(self):
for page in self.notes:
print(f"page : {page}, 내용 : {self.notes[page]}")
def get_number_of_pages(self):
return len(self.notes.keys())
In [74]:
notebook = Notebook('taeho')
note1 = Note('1번째 메모')
note2 = Note('2번째 메모')
notebook.add_note(note1)
notebook.add_note(note2)
notebook.print_notes()
page : 1, 내용 : 1번째 메모
page : 2, 내용 : 2번째 메모
In [78]:
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), "살입니다.")
In [80]:
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,
" 입니다.")
In [81]:
taeho = Employee('taeho', 27, 'm', '3000', '21-01-01')
In [84]:
taeho.about_me()
저의 이름은 taeho 이구요, 제 나이는 27 살입니다.
제 급여는 3000 원 이구요, 제 입사일은 21-01-01 입니다.
Visibility¶
- Private 변수 선언 : 변수명 앞에 __
- Protected 변수 선언 : 변수명 앞에 _
In [115]:
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)
In [98]:
my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
print(my_inventory.get_number_of_items())
new item added
new item added
2
In [111]:
# Private 변수로. 객체에서 접근 못함
print(my_inventory.__items)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
C:\Users\gksdk\AppData\Local\Temp/ipykernel_8596/2192404352.py in <module>
1 # Private 변수로. 객체에서 접근 못함
----> 2 print(my_inventory.__items)
3 # add_new_item에서 Product 타입만 받기 때문에 ValueError 출력
4 my_inventory.add_new_item(object)
AttributeError: 'Inventory' object has no attribute '__items'
In [112]:
# add_new_item에서 Product 타입만 받기 때문에 ValueError 출력
my_inventory.add_new_item(object)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:\Users\gksdk\AppData\Local\Temp/ipykernel_8596/1066437233.py in <module>
1 # add_new_item에서 Product 타입만 받기 때문에 ValueError 출력
----> 2 my_inventory.add_new_item(object)
C:\Users\gksdk\AppData\Local\Temp/ipykernel_8596/587237945.py in add_new_item(self, product)
9 print("new item added")
10 else:
---> 11 raise ValueError("Invalid Item")
12
13 def get_number_of_items(self):
ValueError: Invalid Item
내장함수 property를 데코레이터로 사용¶
@propery
In [125]:
class Inventory(object):
def __init__(self):
self.__items = []
@property
def items(self):
return 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)
In [126]:
my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
print(my_inventory.get_number_of_items())
items = my_inventory.items
items.append(Product())
print(my_inventory.get_number_of_items())
new item added
new item added
2
3
In [ ]:
'부스트캠프 AI Tech > Python' 카테고리의 다른 글
[08] Exception (0) | 2022.01.14 |
---|---|
[07] 내장함수 property와 Decorator (0) | 2022.01.13 |
[05] 가변인자 (0) | 2022.01.12 |
[04] Black으로 파이썬 코드 스타일 통일하기 (0) | 2022.01.12 |
[03] 문자열 함수 정리 (0) | 2022.01.12 |