파이썬 - 클래스

JiWOn·2023년 1월 5일
0

🦁멋쟁이 사자처럼 AI School 8기 강의
👩‍💻 박두진 강사님 강의 4일차 (2023.1.5)

클래스

변수, 함수를 묶어서 코드를 작성하는 방법

1. 사용방법

  1. 클래스 선언 (코드작성)
  2. 객체생성 (메모리 사용)
  3. 메서드 실행 (코드실행)

클래스 선언

🔢계산기 클래스를 만들어보자!

class Calculator:
	num1, num2 = 1, 2
    
    def plus(self):
    	return self.num1+self.num2
    
    def minus(self):
    	return self.num1-self.num2

객체 생성

🔢계산기1, 계산기2를 만들어보자!

calc1 = Calculator()
calc2 = Calculator()

클래스인지 함수인지 구별하기 위해서 식별자를 보고 구분합니다

객체에 들어있는 변수를 출력해보자!

dir(calc1)

  • __ 인 메서드는 자동으로 만들어지는 메서드!

객체 변수를 수정해보자

🔢계산기1에서 num1의 값을 20으로 바꿔보고 싶을 때,

calc1.num1 = 20
calc1.plus(), calc1.minus() # (22,18)

메서드 실행

🔢 계산기1에서 덧셈과 뺄셈을 실행해보자!

calc1.plus(), calc.minus() # (3,-1)

2. self가 누구야?

클래스에서 계속해서 나오는 self

self나 자신 을 뜻한다.

🔢계산기1에서 계산기 클래스에서 뜻을 확인해보자!

class Calculator:
	num1, num2 = 1, 2
    
    def plus(self):
    	return self.num1+self.num2 # <- calc1.num1+calc1.num2
    
    def minus(self):
    	return self.num1-self.num2 # <- calc1.num1-calc1.num2

3. Special 메서드

특별한 기능을 하는 메서드 : 앞 뒤로 __을 붙인다

생성자메서드 : __init__()

  • 객체를 생성할 때 실행되는 메서드
  • 변수의 초기값을 설정할 때 주로 사용
  • 불량객체(메서드 사용x)가 만들어질 확률을 줄여줌

1) 🔢계산기 클래스에서 클래스를 호출할 때 n1,n2 값 부르게 하려면

class Calculator:
	def __init__(self,n1,n2):
    	self.n1 = n1
        self.n2 = n2
    
    def plus(self):
    	return self.num1+self.num2 # <- calc1.num1+calc1.num2
    
    def minus(self):
    	return self.num1-self.num2 # <- calc1.num1-calc1.num2
        
calc1 = Calculator(100,200)

__init__함수에 자기자신과 호출할 때 받은 n1,n2값을 자신의 클래스에 넣음

2) 🔢계산기 클래스에서 n1,n2값 없이도 호출할 수 있게 하려면

class Calculator:
	def __init__(self,n1=1,n2=2):
    	self.n1 = n1
        self.n2 = n2
    
    def plus(self):
    	return self.num1+self.num2 # <- calc1.num1+calc1.num2
    
    def minus(self):
    	return self.num1-self.num2 # <- calc1.num1-calc1.num2
        
calc2 = Calculator()

함수에서 파라미터에 초기값 부여해주듯이 적어주면 됨

+ 연산자 정의 : __add__()

데이터타입

모든 연산은 데이터타입에 따라서 수행되는 연산이 다릅니다

📝예제

d1,d2,d3,d4 = 1,2,'3','4'
d1+d2, d3+d4 #3, '34'
  • int계산과 str계산에서 +연산은 차이가 남
    • d1.__add__(d2) == d1+d2 < int의 __add__() 메서드
    • d3.__add__(d4) == d3+d4 < str의 __add__() 메서드

str 출력 : __str__()

클래스로 불러온 변수를 프린트 했을때 나오는 모습

그냥 이해가 안될 땐 아래 예시를 보자!

예제> 덧셈을 뺄셈으로❓❗

새로운 클래스 Number를 만들어 +연산을 할 때 뺄셈이 되도록 해보자!

class Number:
    def __init__(self, data):
        self.data = data

    def __add__(self, obj):
        return self.data - obj.data

    def __str__(self):
        return str(self.data)+'?'
        
num1 = Number(5)
num2 = Number(3)
print(num1, num2) # 5? 3?
num1+num2 # 2 
  • print문에서 num1과 num2를 출력했을 때 클래스에서 지정한 str에서 ? 나오도록 코드를 작성
  • 연산자는 +를 사용하였지만 __add__()를 사용하여 -가 계산되게 함

4. class는 사용자 정의 데이터 타입

💡 확인해보자

  • calc1 의 데이터 타입 type(calc1)을 하면 답은 Calculator
  • calc1 의 객체가 만들어진 클래스는 Calculator
  • 데이터 타입 == 클래스
  • Calculator 우리가 만든 클래스임

5. 상속

다른 클래스의 변수 메서드를 가져와서 사용하는 방법

아이폰시리즈

아이폰 시리즈에 따른 기능 차이로 만들어보자

아이폰 1 - call
아이폰 2 - call, send_msg
아이폰 3 - call, send_msg, internet

이렇게 된다고 했을 때, 상속이 포함된 클래스를 작성해보자!

class iPhone1:
    
    def call(self):
        print('calling!')

class iPhone2(iPhone1):

    def send_msg(self):
        print('send_msg')

class iPhone3(iPhone2) :

    def internet(self):
        print('internet!')

아이폰 시리즈에서 계속해서 이어지는 call기능과
아이폰2에서부터 시작된 send_msg기능을 상속받아버림

진짜 상속받아졌는지 확인해보자!

def show_vars(obj):
    return [var for var in dir(obj) if var[0]!='_']

show_vars(iphone1),show_vars(iphone2),show_vars(iphone3)

결과
(['call'], ['call', 'sed_msg'], ['call', 'internet', 'sed_msg'])

6. 오버라이딩

상속에서부터 이어지는 이야기

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

간단하게 설명해주셔서 짧게 이야기해본다면
아이폰시리즈에서 아이폰3에서 영상통화가 가능해짐! 이럴경우에 코드가?

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!')

이렇게 또다시 calling을 불러와서 video calling으로 바꿔주면됨!

ip1 = iPhone1()
ip3 = iPhone3()

ip1.call() , ip3.call() #calling! , video calling!

여기서 보이다 싶이 iPhone3 클래스는 영상통화 화면이 뜨지만 iPhone1 클래스는 calling으로 유지!

7. 다중 상속

파이썬에서만 존재하는 다중 상속
여러개의 클래스를 상속받고 싶을 때 사용

아이폰4에는 아이폰3 + 계산기 클래스가 합쳐지고 카톡기능이 추가되었다고 하자

이럴경우에 코드는?

class iPhone4 (iPhone3, Calculator):
	def kt(self,msg):
    	print(f'{msg}가 카톡으로보내짐!')

클래스를 호출할 때
class iPhone4 (iPhone3, Calculator):
여기서 iPhone3와 Calculator의 순서가 중요함!
< 사유

  • 오버라이딩 때문에 순서가 중요해짐
  • Calculator > iPhone3 > iPhone4

... 썩 맘에들지 않는 예시임 ㅠ

8. 데코레이터(Decorator)

함수에서 중복되는 코드를 빼서 데코레이터 함수로 만들어 코드를 작성하는 방법

  • 원래있던 함수에 새로운 기능을 추가한 함수로 변경할 때 주로 사용
  • 함수 위에 사용되거나 클래스의 메서드에 사용된다

📝예시: 실행속도를 계산해보자!

# timer 데코레이터 함수 생성
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time() # 현재시간 체크
        result = func(*args, **kwargs)
        end = time.time()
        print(f'running time : {end-start} sec')
        return result
    return wrapper
    
@timer
def plus(n1,n2):
    return n1+n2

plus(3,2)

결과

running time : 1.430511474609375e-06 sec
5

0개의 댓글