- 클래스(class) 2
- getter, setter
- mangling
- 메서드의 종류
- 클래스 설계
- 입출력
- pickle
: 객체의 내부 변수에 접근할 때 특정 메서드를 거쳐서 접근할 수 있도록 하는 방법
🔹 새 PW 입력 전 기존 PW 입력 과정 추가하기
class Person:
def __init__(self, pw):
self.hidden_pw = pw
# pw를 불러올 때 앞 2자리만 보여주고 나머지는 '*'로 표시함
def getter(self):
print('getter')
return self.hidden_pw[:2] + len(self.hidden_pw[2:])*'*'
# 새로운 pw로 변경 전 기존 pw 입력 받음
def setter(self, new_pw):
print('setter')
input_pw = input('insert password : ')
if input_pw == self.hidden_pw:
self.hidden_pw = new_pw
else:
print('wrong password!')
pw = property(getter, setter)
person = Person('abcd') # 객체 생성, pw == 'abcd'
person.pw # 'abcd'
person.pw = 'efgh' # 기존 pw 입력 후 새 pw로 변경 가능
person.pw # 'efgh'
=> 출력할 땐 getter함수 통해서 출력
=> 입력할 땐 setter함수 통해서 입력
: 변수에 직접적으로 접근하는 것을 막는 방법
: setter함수를 통해서만 입력을 받도록 만드는 방법
🔹 사용법
: 변수명 앞에 __를 붙임
class Person:
def __init__(self, pw):
self.__hidden_pw = pw # mangling
def getter(self):
print('getter')
return self.__hidden_pw
def setter(self, new_pw):
print('setter')
input_pw = input('insert password : ')
if input_pw == self.__hidden_pw:
self.__hidden_pw = new_pw
else:
print('wrong password!')
pw = property(getter, setter)
person = Person('abcd') # 초기 pw == 'abcd'
person.pw # 'abcd'
person.__hidden_pw = 'qqqq' # 직접 변수에 접근하여 새 pw 'qqqq'로 변경 시도
person.pw # 'abcd', pw 변경 X
class Account:
interest = 1.01 # 이자율 1%
def __init__(self, asset=10000):
self.asset = asset
def __show_asset(self): # mangling
print('total asset', self.asset)
def deposit(self, amount):
self.asset += amount
def withdraw(self, amount):
if self.asset >= amount:
self.asset -= amount
else:
self.__show_asset() #print('total asset', self.asset)
def add_interest(self):
self.asset = int(self.asset * self.interest)
self.__show_asset() #print('total asset', self.asset)
def change_interest(self, interest):
if interest < 1.10:
self.interest = interest
else:
print('이자율을 10% 미만으로 설정해주세요.')
@classmethod
def cls_change_interest(cls, interest):
if interest < 1.10:
cls.interest = interest
else:
print('이자율을 10% 미만으로 설정해주세요.')
@staticmethod
def interest_grade(interest):
if interest > 1.05:
print('high interest')
elif interest > 1.02:
print('middle interest')
else:
print('low interest')
account1 = Account(10000)
account2 = Account(20000)
account3 = Account(30000)
🔹 인스턴스 메서드
account1.change_interest(1.09)
account1.asset, account2.asset, account3.asset,\
account1.interest, account2.interest, account3.interest
결과
(10000, 20000, 30000, 1.09, 1.01, 1.01)
=> 객체 account1의 이자율만 1.09로 변경
🔹 클래스 메서드
Account.cls_change_interest(1.04)
account1.asset, account2.asset, account3.asset,\
account1.interest, account2.interest, account3.interest
결과
(10000, 20000, 30000, 1.09, 1.04, 1.04)
=> 이미 다른 저장공간의 속성을 참조하는 객체 account1을 제외한 account2, account3의 이자율이 1.04로 변경
🔹 스태틱 메서드
Account.interest_grade(account1.interest)
Account.interest_grade(account2.interest)
결과
high interest
middle interest
=> 객체를 선언하지 않고 직접 메서드 호출
=> 클래스 메서드와 달리 클래스 내 변수 변경 불가
🔹 is a
: A is a B
: 상속을 이용해서 클래스 설계
class Info:
def __init__(self, name, email):
self.name = name
self.email = email
class Person(Info):
def show(self):
print(self.name, self.email)
person = Person('shay','shay@gmail.com')
person.show() # shay shay@gmail.com
🔹 has a
: A has a B
: 객체를 객체에 넣어서 클래스 설계
class Name:
def __init__(self, name):
self.name_str = name
class Email:
def __init__(self, email):
self.email_str = email
class Person:
def __init__(self, name_obj, email_obj):
self.name = name_obj
self.email = email_obj
def show(self):
print(self.name.name_str, self.email.email_str)
name_obj = Name('shay')
email_obj = Email('shay@gmail.com')
person = Person(name_obj, email_obj)
person.show() # shay shay@gmail.com
: io, input & output
: RAM <-> SSD(HDD)
: 자동 직렬화, 입출력 속도 빠름
** '직렬화'란? RAM에서 SSD로 저장할 때 필요한 과정
class Msg:
def __init__(self, data):
self.data = data
msg = Msg('AI School')
msg.data # 'AI School'
🔹 입력
import pickle
# RAM > SSD
with open('msg.pkl', 'wb') as file:
pickle.dump(msg, file)
🔹 출력
# SSD > RAM
with open('msg.pkl', 'rb') as file:
load_msg = pickle.load(file)
load_msg.data # 'AI School'
📌 클래스 내 변수의 직접적 접근을 제한하는 방법들: getter(출력), setter(입력), mangling(접근X)
📌 스태틱 메서드 : 객체 선언하지 않고 메서드 호출. 클래스 변수 수정 X
📌 pickle : 파일 입출력 시 사용
일주일 중 질문을 가장 많이 한 날!
점심 때 밀가루를 많이 먹었더니 아주 많이 졸렸다. 다음부턴 점심에는 밀가루 말고 쌀을 먹는 걸로...
클래스 설계 중 'A has a B'를 구현하는 코드가 이해하기 어려웠음
일주일 동안 박두진 강사님께 배운 내용 한번 쭉 복습하기