Today I Learned

[TIL] 파이썬 기초 - 클래스, 상속, 상관분석

by Holly Yoon

TIL

1. 클래스

  • 변수, 함수를 묶어서 코드를 작성하는 방법으로 객체 지향을 구현하는 문법
  • 클래스 사용법 : 클래스 선언(코드 작성) > 객체 생성(메모리 사용) > 메서드 실행(코드 실행)
  • 식별자 컨벤션 : (변수, 함수) snake_case, (클래스) PascalCase, UpperCamelCase
  • 데이타를 표현하는 속성(attribute)과 행위를 표현하는 메서드(method)를 포함하는 논리적인 컨테이너
# 클래스선언 : 코드작성
# 계산기 설계 : Calculator : number1, number2, plus(), minus()
class Calculator:

    number1, number2 = 1, 2

    def plus(self):
        return self.number1 + self.number2
    
    def minus(self):
        return self.number1 - self.number2
        
# 객체생성 : 메모리사용
calc1 = Calculator()
calc2 = Calculator()

# 메서드실행 : 코드실행
calc1.plus(), calc1.minus()
>> (3,-1)

참고 <예제로 배우는 파이썬 프로그래밍>

2. Self 개념

  • 인스턴스 메서드는 인스턴스 변수에 엑세스할 수 있도록 메서드의 첫번째 파라미터에 항상 객체 자신을 의미하는 "self"라는 파라미터를 갖는다.
  • 인스턴스 변수는 클래스 내부에서는 self.width 과 같이 "self." 을 사용하여 엑세스하고, 클래스 밖에서는 "객체변수.인스턴스변수"와 같이 엑세스 한다.
#클래스 선언
class Account:
	balance=0
    #입금
    def insert(self, amount):
    	self.balance += amount
	#출금
	def withdraw(self, amount):
    	if self.balance >= amount:
        	self.balance -= amount
        else:
        	print(f'잔액이 {amount-self.balance}원 부족합니다.')

#객채 생성
account = Account()
account.balance
>>0

#메서드 실행
account.insert(1000)
>>1000

참고 블로그글 <Self 및 Class개념 잡기>

  • Special Method : __del__, __add__, __sub__, __cmp__, __str__(문자열을 객체로 표현) 
  • Class는 사용자 정의 데이터 타입이다.
  • list 클래스는 우리가 만들지 않아도 파이썬에서 제공해준다.
  • 데이터 타입의 메서드는 암기할 필요가 없다. dir() 종류 확인 / help() 설명 확인
data=[1,2,3]
type(data)
>>list

[var for var in dir(data) if var[0] != '_']
>>'append',...

help(data.pop)

3. 데이터 타입과 연산

  • 데이터 타입에 따라 수행되는 연산이 다르다. (=같은 연산자를 사용하더라도 결과 값이 다르다.)
d1, d2, d3, d4 = 1, 2, '3', '4'
d1 + d2, d1.__add__(d2), d3 + d4, d3.__add__(d4)
>> (3, 3, '34', '34')
  • 덧셈연산을 하지만, 뺄셈연산이 수행되는 객체를 생성해보자
# 덧셈연산을 하지만 뺄셈연산이 수행되는 객체를 생성
class Number:
    def __init__(self, data):
        self.data = data
    #뺄셈이 되도록
    def __add__(self, obj):
        return self.data - obj.data
	#print()하더라도 본인이 나오도록
    def __str__(self):
        return str(self.data)
	#n1, n2하더라도 본인이 나오게
    def __repr__(self):
        return str(self.data)

4. 상속

  • 다른 클래스의 변수(메서드)를 가져와서 사용하는 방법
class iPhone1:
    def call(self):
        print('calling!')

class iPhone2(iPhone1):
    def send_msg(self):
        print('send_msg!')

class iPhone3(iPhone2):
    def call(self):
        print('video calling!')
    def internet(self):
        print('internet!')
  • 다중 상속
class Human:
    def walk(self):
        print('walking!')

class Korean:
    def eat(self):
        print('eat kimchi!')

class Indian:
    def eat(self):
        print('eat curry!')

# Human > Korean > Jin 순으로 실행된다
class Jin(Korean, Human):
    def skill(self):
        print('coding')

5. 데코레이터

  • 함수에서 중복된 코드를 데코레이터 함수로 만들어 코드를 작성한다.
# 패스워드를 맞춰야 함수의 실행이 가능하도록 하는 데코레이터 작성
def admin(func):
    def wrapper(*args, **kwargs):
        pw = input('insert password : ')
        if pw == 'python': # 패스워드 맞음
            result = func(*args, **kwargs)
        else: # 패스워드 맞지 않음
            result = 'wrong password!'
        return result
    return wrapper
    
def plus(n1, n2):
    return n1 + n2
@admin
def minus(n1, n2):
    return n1 - n2

minus(1,2)
>>패스워드가 'python'이 아니면 실행이 안됨

6. 상관계수

  • 공분산(방향성o), 상관계수(방향성o, 강도o), 결정계수(강도o)
  • 결정계수는 모델 성능 평가에 활용된다.
  • 패키지를 단순히 가져다가 모델을 만드는 것은 경쟁력이 없다. 
  • 계산량이 많은 것은 C언어로 구현 -> 파이썬 패키지로 구성하는 식으로 모델링을 해보는 연습 필요.
# 공분산 // - 1 : 자유도
def covariance(x, y):
    cov = 0
    x_ = sum(x) / len(x)
    y_ = sum(y) / len(y)
    for xi, yi in zip(x, y):
        cov += (xi - x_) * (yi - y_)
    return cov / (len(x) - 1)

# 상관계수
def cc(x, y):
    cov = covariance(x, y)
    var = (variance(x) * variance(y)) ** 0.5
    return cov / var

 

***
첫 번째 파이썬 공부의 난관이라고 생각했던 클래스까지 왔다... ㅎ
복습 많이 필요..

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기