본문 바로가기

Python/▶ Python

TIL ⑤일차

728x90

1.Class -getter, setter

 

※클래스를 이용한 스타크래프트 퀴즈 예시:

 

● getter, setter

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

 

더보기

음..보다보니까 코드가 이해는 되는데 이렇게 만들라면 좀 어려울듯....

일단 코드 저장해 놓고 많이 자주 보고 조금씩 따라해 보는 수밖에 없을 것 같다

class Person:

    def __init__(self, pw):
        self.hidden_pw = pw
    
    @property
    def pw(self):
        print('getter')
        return self.hidden_pw[:2] + '****'

    @pw.setter
    def pw(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!')
            

person = Person('abcd')


person.pw = 'qwer'
--------------------
setter


person.pw
-------------------
getter
'qwer'

 

● mangling

 ▶ 변수에 직접적으로 접근하는 것을 막는 방법

 ▶ 사용법 : 변수명 앞에 __를 붙임

 

더보기

일단 이것도 코드는 가져와서 작성해놓았는데...진짜 무슨 말인지 하나도 이해가 안 된다..

마침 이거 설명 다 하시고 강사님도 지금 당장은 몰라도 크게 문제는 없고,

회사가서 코드를 보다 보면 접할수도 있지만 지금 레벨에서도 이 정도의 코드는 작성하지 않는다고 말씀하셨다..

그래도 나중에 또 어디선가 듣고 반복적으로 계속 학습하듯이 보는건 중요할 것 같다.

자주 보기 위해 저장해놓자.

class Person:

    def __init__(self, pw):
        self.hidden_pw = pw

    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')
person.__hidden_pw = 'qqqq'
# person.pw



# _Person__hidden_pw
# dir(person)
person._Person__hidden_pw = 'aaaa'


person.pw
--------------------------------
getter
'abcd'


person.__hidden_pw = 'qqqq' # X
person.pw = 'wwww' # O
---------------------------------
setter

●메서드의 종류 3가지

 ▶1) 인스턴스 메서드 : 파라미터 self : 객체를 이용하여 메서드 호출

        (일반적으로 쓰이는 메서드. self가 다 쓰임)

 ▶2) 클래스 메서드 : 파라미터 cls : 클래스를 이용하여 메서드 호출 : 객체로 생성된 초기 변수 값 모두 수정

        (※인스턴스 메서드를 통해 변수값을 전부 바꾼 상태라면 클래스 메서드 사용해도 아무 변화 X)

 ▶3) 스태틱 메서드 : 파라미터 x : 객체를 선언하지 않고 메서드 호출 

        (일반 함수라고 생각 . 클래스 안에 놓여져 있는 그냥 함수)

 

※ 아래 예시 참고

더보기
class Account:
    interest = 1.01 # 이자율 1%
    
    def __init__(self, asset = 10000):     #생성자(초기변수) 지정 == asset
        self.asset = asset

    def deposit(self, amount):             # 예금하는 함수
        self.asset += amount

    def withdraw(self, amount):            # 출금하는 함수
        if self.asset >= amount:
            self.asset -= amount
        else:
            print('total asset : ', self.asset)

    def add_interest(self):                             # 이자율 증가 함수 추가 : 반복 실행해보니 기존에 설정되어 있는 default asset에  
        self.asset = int(self.asset * self.interest)    # default interest 가 들어가서 파라미터에 별도에 변수를 넣어주지 않는 것 같다
        print('total asset', self.asset)

    def change_interest(self, interest):    # 이자율 변경 함수 추가 : interest라는 변수가 들어가야 해서 파라미터에 interest 들어가야한다
        if interest <=1.10:
            self.interest =interest
        else:
            print('이자율을 10% 미만으로 설정해주세요.')

    @classmethod                          
    def cls_change_interest(cls, interest): #Account 클래스를 그대로 불러와서 실행. 해당클래스로 만들어진 객체의 변수 전부 변경
        if interest < 1.10:
            cls.interest = interest
        else:
            print('이자율을 10% 미만으로 설정해주세요.')

    @staticmethod
    def interest_grade(interest):           #Account 클래스에서 바로 함수처럼 사용 
        if interest > 1.05:
            print('high interest')
        elif interest > 1.02:
            print('middle interest')
        else:
            print('low interest')

 

● 클래스 설계 (is a, has a 개념)

 

 ▶ is a : A is a B: 상속을 이용하여 클래스 설계

 ▶ has a : A has a B : 객체를 객체에 넣어서 클래스 설계

 ▶ 2가지 방법 혼용해서 사용

 

※ is a 예시 :

 

더보기
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('peter', 'peter@gmail.com')
person.name, person.email # == person.show 
-------------------------------------------
peter peter@gmail.com

 

※has a 예시:

 

더보기
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,

 

2. 입출력

● RAM  >  SSD(HDD),  RAM < SSD(HDD)

● RAM  > 직렬화  (byte()) < SSD(HDD)

● pickle : 직렬화, 입출력 속도 빠름

class Msg:
    def __init__(self, data):
        self.data = data
        
msg = Msg('AI School')
msg.data

 

RAM  >  SSD(HDD)

 

import pickle
with open('msg.pkl','wb') as file:    		          #'msg.pkl' -> 파일 형태로 저장해야하므로 저장할 이름
											          #wb :이진수 형태로 write 하겠다 ,#rb : 파일 불러올 땐 rb
     pickle.dump(msg, file)                 
     msg #이 메모리에 저장되어 있는 값을 하드 디스크에 저장
 -----------------------------------------------------
 <__main__.Msg at 0x7f79056fe850>

 

RAM < SSD(HDD)

 

with open('msg.pkl', 'rb') as file:
load_msg = pickle.load(file)       #실행해보니까 load는 없어도 되는것 같다
    

load_msg.data					   #실행해보니까 load는 없어도 되는것 같다
-----------------------------------
'AI School'

 

※입출력 사용 안할 시

더보기
# 입출력 사용 X
# 학습 데이터 > 모델링(학습:8h) > 모델객체(RAM) > 예측
# 학습 데이터 > 모델링(학습:8h) > 모델객체(RAM) > 예측
# 학습 데이터 > 모델링(학습:8h) > 모델객체(RAM) > 예측

 

# 입출력 사용 O
# 학습 데이터 > 모델링(학습:8h) > 모델객체(RAM) > 모델저장(SSD) > 예측
# 모델로드(SSD > RAM : 5min) > 예측

 

● 상관계수 구하기 예제

더보기
# 상관계수 구하기
import numpy as np
np.corrcoef(data['meeting_count'], data['sales'])[0, 1],\
np.corrcoef(data['meeting_time'], data['sales'])[0, 1]
 
# 모델링 : 미팅 횟수, 미팅 시간으로 매출을 예측 모델
import pandas as pd
features = pd.DataFrame({
    'meeting_count': data['meeting_count'],
    'meeting_time': data['meeting_time'],
})
target = data['sales']
features[:2]

 

from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(features, target)
type(model) #LinearRegression 라는 클래스 = 데이터 타입
------------------------------------------------------
sklearn.linear_model._base.LinearRegression
model.predict([[200,20]])
-------------------------
/usr/local/lib/python3.8/dist-packages/sklearn/base.py:450: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names
  warnings.warn(
array([16.03957923])
%ls
-----
model.pkl  msg.pkl  sales.pkl  sample_data/
# SSD > RAM
with open('model.pkl', 'rb') as file:
    load_model = pickle.load(file)

load_model.predict([[100, 10]])
-------------------------------------
/usr/local/lib/python3.8/dist-packages/sklearn/base.py:450: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names
  warnings.warn(
array([10.9072636])

 

어찌저찌 이번주 강의내용 전부 TIL에 작성은 완료... 

주말에 이번주 강의내용 처음부터 끝까지 한번 보면서, 코드도 다시 짜보고 

바로바로 이해되고 코드 되는건 넘어가고 안되는 부분만 집어서 어디인지 정리도 하고 다시 공부해보고 해야겠다

728x90

'Python > ▶ Python' 카테고리의 다른 글

TIL ④일차  (0) 2023.01.05
TIL ③일차  (0) 2023.01.04
②일차 Quiz - 윤년, Fizzbuzz, left-shift  (0) 2023.01.03
②일차 Quiz - 아이폰과 아이패드  (0) 2023.01.03
TIL ②일차  (2) 2023.01.03