1. 클래스
클래스는 데이터(멤버)와 기능(메서드)을 가지고 있는 인스턴트 객체를 생성하기 위한 역할을 합니다. 파이썬은 대표적인 객체지향 프로그래밍 언어이며 클래스는 일종의 설계도면입니다. 파이썬은 이 설계도면을 보며 하나의 인스턴스 객체를 만들어 냅니다. 그리고 인스턴스 객체를 선언하여 사용할 수 있게 됩니다.
class Car(object): # 앞부분을 대문자로 사용합니다.
MaxSpeed = 300
MaxPeople = 5
def move(self, x):
print(x, '의 스피드로 움직이고 있습니다.')
def stop(self):
print('멈췄습니다.')
k5 = Car()
k3 = Car()
k5.move(10) # 10 의 스피드로 움직이고 있습니다.
k5.stop() # 멈췄습니다.
k3.move(5) # 5 의 스피드로 움직이고 있습니다.
k3.stop() # 멈췄습니다.
print(k5.MaxSpeed) # 300
print(k3.MaxSpeed) # 300
1.1 클래스 변수
클래스 변수는 해당 클래스를 통해 만들어진 모든 인스턴스 객체들이 공유하는 변수 값입니다. 각 인스턴스 객체들 각자가 관리하고 있는 변수는 인스턴스 변수라고 합니다.
클래스 변수는 아래의 예시와 같이 클래스 이름을 통해서 접근할 수 있습니다. (주의: 변수 이름으로 접근하지 않습니다!)
class Car(object):
# 클래스 변수 위치 (파이썬 규약에 따라 indent로 결정)
kinds = []
speed = 300
def add_kinds(self, name):
self.kinds.append(name)
def change_speed(self, speed):
self.speed = speed
k5 = Car()
k3 = Car()
k5.add_kinds('k5')
k3.add_kinds('k3')
k5.change_speed(500)
k3.change_speed(250)
print('k5.kinds:', k5.kinds) # k5.kinds: ['k5', 'k3']
print('k3.kinds:', k3.kinds) # k3 kinds: ['k5', 'k3']
print('k5.speed:', k5.speed) # k5.speed: 500
print('k3.speed:', k3.speed) # k3.speed: 250
kinds 배열의 경우에는 각 인스턴스 객체가 해당 배열의 주소를 참조하고 있기 때문에, 그 배열의 주소에 접근하여 조작해서 마치 클래스 변수와 동일하게 동작을 하게 된 것입니다. 반면에 speed 의 경우에는 단순히 값이기 때문에 주소가 따로 없으므로 각 인스턴스 객체가 값만을 가지고 있습니다. 따라서 각 인스턴스 객체들의 값이 따로 변하게 됩니다.
2. init 함수
__init__ 메서드는 다른 프로그래밍 언어에서의 생성자(constructor) 역할을 하는 클래스 메서드입니다. 이 메서드는 인스턴스 객체를 생성할 때 자동으로 실행됩니다.
2.1 인스턴스 함수
인스턴스 객체들이 모두가 공통으로 공유하는 값이 클래스 변수라면, 인스턴스 변수는 각 인스턴스 객체들 각자가 가지고 있는 값입니다.
인스턴스 변수는 init 메서드 안에서 선언을 해주어야 합니다. 이곳에서 선언된 변수들은 각 인스턴스 객체들의 변수로 활동할 수 있습니다.
class Car(object):
MaxSpeed = 300 # 공유하는 영역
MaxPeoeple = 5 # 공유하는 영역
def __init__(self, 이름): #self는 자신만의 영역
self.name = 이름
def move(self, x):
print(self.name, x, '의 스피드로 움직이고 있습니다.')
def stop(self):
print('멈췄습니다.')
k5 = Car('케이파이브')
k3 = Car('케이쓰리')
k5.move(100) # 케이파이브 100 의 스피드로 달리고 있습니다.
k3.move(200) # 케이쓰리 200 의 스피드로 달리고 있습니다.
init이라는 메서드를 호출하지 않고 Car('케이파이브')로 인스턴스 객체를 생성하면서 매개변수로 name을 넣어주는 것을 확인할 수 있습니다. 초기화 함수를 사용하기 위해서는 반드시 __init__을 사용하고, 매개변수는 self로 선언해야합니다.
앞서 클래스 변수를 모든 인스턴스 객체들이 공유했다면, self의 영역은 다른 인스턴스에 해당 변수를 공유하지 않는 고유 영역이라 볼 수 있습니다.
# 속성의 선언 및 사용예시
class BaseballPlayer():
# init 함수 : 이 클래스에서 사용할 변수를 정의하는 함수
def __init__(self, name, position, team, team_score):
# 인스턴스 변수
self.name = name
self.position = position
self.team = team
self.team_score = team_score
def change_team(self):
new_team = input("선수가 이적할 팀을 선택하세요 ")
self.team = new_team
# str 함수 : 인스턴스 자체를 print()함수로 화면에 출력하면 나오는 값
def __str__(self):
return f"안녕하세요. 저는 {self.team}팀의 {self.name}입니다. 저희 팀 순위는 {self.team_score}입니다."
ostin = BaseballPlayer("오스틴", "타자", "LG", 3)
print(ostin)
# 안녕하세요. 저는 LG팀의 오스틴입니다. 저희 팀 순위는 3입니다.
ostin.change_team() # 소속팀을 변경하고 싶다.
# 데이터
names = ["Messi", "Ramos", "Ronaldo", "Park", "Buffon"]
positions = ["MF", "DF", "CF", "WF", "GK"]
numbers = [10, 4, 7, 13, 1]
# 이차원 리스트
players = [[name, position, number] for name, position, number
in zip(names, positions, numbers)]
print(players[0])
# ['Messi', 'MF', 10]
# 전체 SoccerPlayer 코드
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(f"선수의 등 번호를 변경한다: From {self.back_number} to {new_number}")
self.back_number = new_number
def __str__(self):
return f'''Hello, My name is {self.name}.
I play in {self.position} in center. My back number is {self.back_number}.'''
# 클래스-인스턴스
player_objects = [SoccerPlayer(name, position, number)
for name, position, number in zip(names, positions, numbers)]
player_objects[0].change_back_number(7)
print(player_objects[0])
# 선수의 등 번호를 변경한다: From 10 to 7
# Hello, My name is Messi.
# I play in MF in center. My back number is 7.
# 노트기능 클래스로 만들기
class Note:
'''맨처음은 초기화를 시켜야하기 때문에 write = none'''
def __init__(self, write = None):
self.write = write
''' 쓰는 기능 추가 '''
def write_function(self, write):
self.write = write
'''모두 지우는 기능 추가'''
def remove_all(self):
self.write = ""
''' 작성된 내용을 볼 수 있게'''
def __str__(self):
return self.write
class NoteBook:
'''모든 기능을 저장하기 위해 다음과 같이 init에 모두 입력'''
def __init__(self, title):
self.title = title
self.page_number = 1
self.notes = {} # 딕셔너리 형으로 선언 Note Page Number를 Key로 설정해서 쉽게 찾기 위함
''' 새로운 노트를 노트북에 추가하는 함수'''
''' 지금은 기본 기능만 추가했지만 실제 기능 구현시 많은 것을 고려해야함 '''
''' 7페이지면 8페이지에 추가되는 형태로 일단 구현'''
def add_note(self, note, page = 0):
if self.page_number < 300:
if page == 0:
self.notes[self.page_number] = str(note)
self.page_number += 1
else:
self.notes = {page : str(note)}
self.page_number += 1
else:
print("페이지가 300페이지가 넘어서 추가할 수 없어요")
''' 특정 페이지 번호에 있는 노트를 제거하는 함수'''
# 딕셔너리의 Key가 있는지 확인하고 있다면 삭제, 없으면 프린트문 사용해서 경고문장 출력
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_page(self):
return len(self.notes.keys())
note_book_01 = Note("안녕하세요 김예린입니다.")
note_book_02 = Note("저는 축구를 좋아합니다.")
note_book_03 = Note("저는 야구도 좋아합니다.")
my_story = NoteBook("나의 이야기")
my_story.add_note(note_book_01)
my_story.add_note(note_book_02)
my_story.add_note(note_book_03)
print(my_story.title)
print(my_story.page_number)
print(my_story.notes)
# 전체 삭제
note_book_02.remove_all()
print(my_story.get_number_of_page())
print(my_story.remove_note(1))
print(my_story.notes)
# 나의 이야기
# 4
# {1: '안녕하세요 김예린입니다.', 2: '저는 축구를 좋아합니다.', 3: '저는 야구도 좋아합니다.'}
# 3
# 안녕하세요 김예린입니다.
# {2: '저는 축구를 좋아합니다.', 3: '저는 야구도 좋아합니다.'}
# 커스텀 클래스 활용
class User:
""" 사용자 클래스 """
def __init__(self, name, mail):
""" 초기화 처리 """
self.name = name
self.mail = mail
def print_user_info(self):
""" 사용자 정보를 print로 출력 """
print(self.name)
print(self.mail)
# User 타입 객체 생성
user1 = User("User1", "User1@naver.com")
user1.print_user_info()
# User1
# User1@naver.com
user1.mail = "new_user1@naver.com"
user1.print_user_info()
# User1
# new_user1@naver.com
# self.name과 name의 차이
class ClassExample:
@staticmethod
def call(self, name): # 함수
self.name = "self" + name # self.name으로 파라미터와 구분
print("self : " + self.name + "\nparam : " + name)
a = ClassExample() # 객체화 (ClassExample의 정보를 a에 담음)
a.call(a, "철수")
# self : self철수
# param : 철수
* 클래스 속성과 인스턴스 속성의 차이점
# 클래스 속성 사용시 누적이 됨
class Person:
bag = []
def put_bag(self, stuff):
self.bag.append(stuff)
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag)
print(maria.bag)
# ['책', '열쇠']
# ['책', '열쇠']
# 인스턴스 속성 사용시 각자 구성이 됨
class Person:
def __init__(self):
self.bag = []
def put_bag(self, stuff):
self.bag.append(stuff)
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag)
print(maria.bag)
# ['책']
# ['열쇠']
'DATA ANALYSIS > TIL' 카테고리의 다른 글
[Day 17] Python 심화(7) (0) | 2023.05.18 |
---|---|
[Day15] Python 심화(6) (0) | 2023.05.17 |
[VOD] 같이 푸는 PYTHON [심화] (0) | 2023.05.12 |
[Day12] Python 심화(4) (0) | 2023.05.11 |
[Day11] Python 심화(3) (1) | 2023.05.10 |