[230106] 멋쟁이사자처럼 AI SCHOOL 8기 'Python_박두진강사님' 복습 (1/2)

조세연·2023년 1월 6일
0

멋사 AI SCHOOL 8기

목록 보기
9/35

📝Today I learned

🚀 TIL 목차 🚀

  • 클래스(class) 2
    • getter, setter
    • mangling
    • 메서드의 종류
    • 클래스 설계
  • 입출력
    • pickle

클래스(class) 2

1) getter, setter

: 객체의 내부 변수에 접근할 때 특정 메서드를 거쳐서 접근할 수 있도록 하는 방법

🔹 새 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함수 통해서 입력

2) mangling

: 변수에 직접적으로 접근하는 것을 막는 방법
: 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

3) 메서드 종류

  1. 인스턴스 메서드 : 파라미터 self : 객체를 이용하여 메서드 호출
  2. 클래스 메서드 : 파라미터 cls : 클래스를 이용하여 메서드 호출 : 객체로 생성된 초기 변수값을 모두 수정
  3. 스태틱 메서드 : 파라미터 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
=> 객체를 선언하지 않고 직접 메서드 호출
=> 클래스 메서드와 달리 클래스 내 변수 변경 불가

4) 클래스 설계

🔹 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)

pickle

: 자동 직렬화, 입출력 속도 빠름
** '직렬화'란? 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'

❗이것만은 외우고 자자 Top 3

📌 클래스 내 변수의 직접적 접근을 제한하는 방법들: getter(출력), setter(입력), mangling(접근X)

📌 스태틱 메서드 : 객체 선언하지 않고 메서드 호출. 클래스 변수 수정 X

📌 pickle : 파일 입출력 시 사용

🌟데일리 피드백

1. 오늘의 칭찬&반성

일주일 중 질문을 가장 많이 한 날!
점심 때 밀가루를 많이 먹었더니 아주 많이 졸렸다. 다음부턴 점심에는 밀가루 말고 쌀을 먹는 걸로...

2. 내가 부족한 부분

클래스 설계 중 'A has a B'를 구현하는 코드가 이해하기 어려웠음

3. 내일의 목표

일주일 동안 박두진 강사님께 배운 내용 한번 쭉 복습하기

profile
HR Analyst가 되고 싶은

0개의 댓글