🦁멋쟁이 사자처럼 AI School 8기 강의
👩💻 박두진 강사님 강의 4일차 (2023.1.5)
변수, 함수를 묶어서 코드를 작성하는 방법
🔢계산기 클래스를 만들어보자!
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)
클래스에서 계속해서 나오는 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
특별한 기능을 하는 메서드 : 앞 뒤로
__
을 붙인다
__init__()
- 객체를 생성할 때 실행되는 메서드
- 변수의 초기값을 설정할 때 주로 사용
- 불량객체(메서드 사용x)가 만들어질 확률을 줄여줌
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값을 자신의 클래스에 넣음
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'
d1.__add__(d2)
== d1+d2
< int의 __add__()
메서드d3.__add__(d4)
== d3+d4
< str의 __add__()
메서드__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__()
를 사용하여 -
가 계산되게 함💡 확인해보자
calc1
의 데이터 타입 type(calc1)
을 하면 답은 Calculator
calc1
의 객체가 만들어진 클래스는 Calculator
Calculator
우리가 만든 클래스임다른 클래스의 변수 메서드를 가져와서 사용하는 방법
아이폰 시리즈에 따른 기능 차이로 만들어보자
아이폰 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'])
상속에서부터 이어지는 이야기
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
간단하게 설명해주셔서 짧게 이야기해본다면
아이폰시리즈에서 아이폰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으로 유지!
파이썬에서만 존재하는 다중 상속
여러개의 클래스를 상속받고 싶을 때 사용
아이폰4에는 아이폰3 + 계산기 클래스가 합쳐지고 카톡기능이 추가되었다고 하자
이럴경우에 코드는?
class iPhone4 (iPhone3, Calculator):
def kt(self,msg):
print(f'{msg}가 카톡으로보내짐!')
클래스를 호출할 때
class iPhone4 (iPhone3, Calculator):
여기서 iPhone3와 Calculator의 순서가 중요함!
< 사유
... 썩 맘에들지 않는 예시임 ㅠ
함수에서 중복되는 코드를 빼서 데코레이터 함수로 만들어 코드를 작성하는 방법
- 원래있던 함수에 새로운 기능을 추가한 함수로 변경할 때 주로 사용
- 함수 위에 사용되거나 클래스의 메서드에 사용된다
📝예시: 실행속도를 계산해보자!
# 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