본문 바로가기
멋쟁이사자처럼 AI스쿨

상속과 데코레이터(파이썬 강의 Day4)

by 헬푸밍 2023. 1. 5.

상속

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

 

아이폰1은 전화만 가능!

아이폰2는 전화, 메시지 가능!

아이폰3는 전화, 메시지, 인터넷 가능!

이것을 클래스로 작성하면...

class iPhone1:

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

    def call(self):
        print('calling!')
    def send_msg(self):
        print('send_msg!')
        
class iPhone3:

    def call(self):
        print('calling!')
    def send_msg(self):
        print('send_msg!')
    def internet(self):
        print('internet!')
        
iphone1 = iPhone1()
iphone2 = iPhone2()
iphone3 = iPhone3()

이렇게 클래스를 작성하고 객체를 생성!

 

객체에서 우리가 만든 메서드를 확인하는 함수는 아래와 같다.

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

 

코드로 아이폰1, 2 ,3의 메서드를 확인해보면...

class iPhone1:

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

    def call(self):
        print('calling!')
    def send_msg(self):
        print('send_msg!')
        
class iPhone3:

    def call(self):
        print('calling!')
    def send_msg(self):
        print('send_msg!')
    def internet(self):
        print('internet!')
        
iphone1 = iPhone1()
iphone2 = iPhone2()
iphone3 = iPhone3()

def show_vars(obj):
    return [var for var in dir(obj) if var[0] != '_']
    # 객체에서 우리가 만든 메서드를 확인하는 함수
show_vars(iphone1), show_vars(iphone2), show_vars(iphone3)

결과를 보면...

아이폰1은 전화, 아이폰2는 전화, 메세지, 아이폰3는 전화, 메시지, 인터넷 메서드를 가진 것을 확인가능하다!

 

코드에 겹치는 부문이 많으므로...

 

상속을 사용해서 코드를 작성해보자!

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

iphone1 = iPhone1()
iphone2 = iPhone2()
iphone3 = iPhone3()

def show_vars(obj):
    return [var for var in dir(obj) if var[0] != '_']
	# 객체에서 우리가 만든 메서드를 확인하는 함수
show_vars(iphone1), show_vars(iphone2), show_vars(iphone3)

이렇게 상속을 사용하면 겹치는 부분 없이 코드를 작성할 수 있고

메서드도 동일하게 쓸 수 있다.

 

다중상속

아래와 같이 인간은 걷는 메서드,

한국인은 김치먹는 메서드,

인도인은 카레먹는 메서드를 가진 클래스를 작성해보자

class Human:
    def walk(self):
        print('walking!')

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

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

아래는 진이라는 코딩 스킬을 가진 사람의 클래스를 만든 것이다.

class Jin(Korean, Human):
    def skill(self):
        print('coding!')

한국인, 인간이라는 클래스가 다중상속된 코드이다.(상속 순서는 뒤에 있는 파리미터 부터)

 

다시 코드를 합쳐서

class Human:
    def walk(self):
        print('walking!')

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

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

class Jin(Korean, Human):
    def skill(self):
        print('coding!')

jin = Jin()	 # 객체생성

def show_vars(obj):
    return [var for var in dir(obj) if var[0] != '_']
	# 객체에서 우리가 만든 메서드를 확인하는 함수
show_vars(jin)

진이라는 사람의 메서드를 출력해보면...

이렇게 상속된 클래스의 메서드가 출력된다.

 

진이라는 사람의 skill을 알아보고 싶으면...

메서드를 실행해서

class Human:
    def walk(self):
        print('walking!')

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

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

class Jin(Korean, Human):
    def skill(self):
        print('coding!')

jin = Jin()	 # 객체생성

jin.skill() #메서드실행

이렇게 출력하면 된다!

 

데코레이터

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

원래있던 함수에 새로운 기능을 추가한 함수로 변경할때 주로 사용

 

아래의 함수1과 함수2는 중복된 것이 많이 보인다.

def func1():
    print('code1')
    print('code2')
    print('code3')

def func1():
    print('code1')
    print('code4')
    print('code3')

 

중복되는 코드를 데코함수로 빼서 작성해 보자!

def deco(func):
    def wrapper(*args, **kwargs): #지역함수
        print('code1')
        func()  # == func1() : print('code2') : == func2() : print('code4')
        print('code3')
    return wrapper

이렇게 함수안에 함수가 있는 지역함수를 통해 데코레이터 함수를 작성한다.

 

다시 func1과 func2가 돌아가게 만드려면...

def deco(func):
    def wrapper(*args, **kwargs): #지역함수
        print('code1')
        func()  # == func1() : print('code2') : == func2() : print('code4')
        print('code3')
    return wrapper
    
@deco
def func1():
    print('code2')

@deco
def func2():
    print('code4')

func1()
func2()

이렇게 함수를 겹치지 않는 부분만 작성 후

함수 윗부분에 @데코레이터 함수명을 적어주면 된다.

다음과 같이 함수가 출력된다.

 

func1의 작동순서를 보면

먼저, deco함수의 파라미터에 func1이 들어가고

func1함수는 deco함수의 return함수인 wrapper함수로 변경된다.

그래서 위와 같이 출력된다.

 

추가로 데코레이터는 여러 개 적용할 수 있다.

가장 밑에 있는 것부터 실행된다는 것을 참고하자!


이번 시간에는 상속과 데코레이터를 알아봤습니다!

 

고등학교때 재미있게 봤던 상속자들이 생각나네여...

 

나 너 좋아하냐...?

댓글