ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 기초 6. ν΄λž˜μŠ€μ™€ 상속
    PYTHON 2020. 8. 31. 22:13

    🎯 파이썬 ν΄λž˜μŠ€μ™€ 상속을 μ•Œμ•„λ³Έλ‹€.

     

     

     

     

    클래슀

    ν”„λ‘œκ·Έλž¨μ΄ 컀지면 μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄ 클래슀둜 μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜κ³  μ„œλ‘œκ°„μ˜ 결합을 λŠμŠ¨ν•˜κ²Œ ν•΄μ•Όν•œλ‹€. 클래슀λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ„€λͺ…ν•œ 글을 λ¨Όμ € μ°Έκ³ ν•˜λŠ” 게 μ’‹λ‹€.

     

    클래슀 μ„ μ–Έ

    class UserInfo:
        pass

    μ‚¬μš©μž 정보(객체)λ₯Ό 찍어낼 큰 ν‹€(클래슀)λ₯Ό λ¨Όμ € λ§Œλ“ λ‹€. 이 ν‹€ ν•˜λ‚˜λ§Œ 있으면 μ•„μ£Ό λ‹€μ–‘ν•œ μ‚¬μš©μžλ₯Ό μ‰½κ²Œ 생성할 수 μžˆλ‹€.

    클래슀 μ΄λ¦„μ˜ 첫 κΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ μ„ μ–Έν•œλ‹€. μ–΄λ–€ λ‚΄μš©λ„ μž‘μ„±ν•˜μ§€ μ•Šκ³  pass ν‚€μ›Œλ“œλ₯Ό μ“°λ©΄ 일단 μ—λŸ¬μ—†μ΄ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.

     

     

    클래슀 졜초 μ΄ˆκΈ°ν™”

    class UserInfo:
        def __init__(self):
            print("μ΄ˆκΈ°ν™”")
    
    user1 = UserInfo()

    ν΄λž˜μŠ€λŠ” 속성과 λ©”μ†Œλ“œλ‘œ κ΅¬μ„±λœλ‹€. 속성은 객체의 νŠΉμ§•μ„, λ©”μ†Œλ“œλŠ” μˆ˜ν–‰ν•  λ™μž‘μ„ λ‚˜νƒ€λ‚Έλ‹€.

    __init__() λ©”μ†Œλ“œλŠ” 클래슀둜 객체λ₯Ό 처음 찍어낼 λ•Œ μ‚¬μš©λœλ‹€. 클래슀 선언은 ν‹€λ§Œ λ§Œλ“  κ²ƒμ΄λ―€λ‘œ 이 ν‹€λ‘œ 객체λ₯Ό 찍어내야 λ©”λͺ¨λ¦¬μ— μ˜¬λ €μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. ν‹€λ‘œ 객체λ₯Ό μ°μ–΄λ‚΄λŠ” μž‘μ—…μ„ μΈμŠ€ν„΄μŠ€ν™” ν•œλ‹€κ³  ν‘œν˜„ν•˜λŠ”λ°, μ–΄λ–€ λ³€μˆ˜μ— 이 클래슀λ₯Ό ν• λ‹Ήν•΄μ„œ λ©”λͺ¨λ¦¬μ— μƒμ„±ν•˜λŠ” μž‘μ—…μ΄λ‹€. 클래슀둜 μ½”λ”©ν•˜κ³  λ³€μˆ˜μ— ν• λ‹Ήμ‹œμΌœμ„œ μΈμŠ€ν„΄μŠ€ν™”ν•œλ‹€.

    μžλ°”μ™€ 달리 νŒŒμ΄μ¬μ€ λ©”μ†Œλ“œμ˜ 첫번째 λ§€κ°œλ³€μˆ˜μ— selfλ₯Ό λͺ…μ‹œν•œλ‹€. 객체λ₯Ό ν˜ΈμΆœν•  λ•Œ ν˜ΈμΆœν•œ 객체 μžμ‹ μ΄ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. ν˜ΈμΆœν•  땐 selfλ₯Ό μƒλž΅ν•œλ‹€.

    class UserInfo:
        def __init__(self, name):
            self.name = name
        def user_info_p(self)
            print("name : ", self.name)
    
    user1 = UserInfo("Kim")
    user1.user_info_p()

    initλ©”μ†Œλ“œ μΈμžμ— nameμ΄λΌλŠ” μœ μ €μ˜ 속성을 λ„£μ–΄λ³Έλ‹€. selfλΌλŠ” μœ μ €μΈν¬μ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•ˆμ˜ name속성에 name을 λ„£μ–΄μ€€λ‹€.

    이제 UserInfo ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™” 될 λ•Œλ§ˆλ‹€ 이름을 인자둜 λ°›μ•„μ•Όν•œλ‹€. user1을 객체생성할 λ•Œ Kim을 λ„£κ³  user1 객체의 λ©”μ†Œλ“œμΈ user_info_p()λ₯Ό ν˜ΈμΆœν•˜λ©΄ user_info_p()ν•¨μˆ˜ μ‹€ν–‰ν•΄μ„œ μ €μž₯된 λ„€μž„μ„ 좜λ ₯ν•˜κ²Œλœλ‹€.

     

     

    λ„€μž„μŠ€νŽ˜μ΄μŠ€

    μΈμŠ€ν„΄μŠ€κ°€ κ°–κ³ μžˆλŠ” μžκΈ°μžμ‹ μ˜ μ €μž₯곡간.

    print(id(user1))
    print(id(user2))

    id() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•΄ 같은 클래슀둜 찍어낸 μ„œλ‘œ λ‹€λ₯Έ 객체의 μ£Όμ†Œλ₯Ό 찍어보면 μ—­μ‹œ λ‹€λ₯Έ 값이 λ‚˜μ˜¨λ‹€. λͺ¨λ“  μΈμŠ€ν„΄μŠ€λŠ” 각자 독립적인 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κ°–κ³ μžˆλ‹€.

     

     

    self의 이해

    class SelfTest:
        def function1():
            print("function1 called!")
    
        def function2(self):
            print(id(self))
            print("function2 called!")
    f = SelfTest()
    # f.function1()
    f.function2()
    SelfTest.function1()

    function1()은 self μΈμžκ°€ μ—†λ‹€. λˆ„κ΅¬μ˜ ν•¨μˆ˜μΈμ§€ λͺ¨λ₯΄λŠ” μƒνƒœλ‹€. κ·Έλž˜μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 ν˜ΈμΆœν•  수 μ—†κ³  ν΄λž˜μŠ€μ—μ„œ ν˜ΈμΆœν•΄μ•Όν•œλ‹€. function2() λ©”μ†Œλ“œλŠ” μžκΈ°μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” self 인자λ₯Ό κ°€μ‘ŒκΈ° λ•Œλ¬Έμ— 객체생성 ν›„ λ³€μˆ˜λ₯Ό 톡해 μžκΈ°μžμ‹ μ˜ λ©”μ†Œλ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€.

    ν΄λž˜μŠ€λ³€μˆ˜λŠ” 객체보닀 λ¨Όμ € μƒμ„±λ˜κ³  μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ κ³΅μœ ν•˜κ²Œ 되며 ν΄λž˜μŠ€μ—μ„œ 직접 ν˜ΈμΆœν•  수 μžˆλ‹€. μΈμŠ€ν„΄μŠ€ ν•¨μˆ˜λŠ” 클래슀λ₯Ό 직접 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ 객체생성할 λ•Œ 인자둜 ν΄λž˜μŠ€μ΄λ¦„μ„ λ„£μ–΄μ€˜μ•Όν•œλ‹€.

     

     

    class Warehouse:
        # 클래슀 λ³€μˆ˜
        stock_num = 0
    
        def __init__(self, name):
            # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
            self.name = name
            Warehouse.stock_num += 1
    
        def __del__(self):
            Warehouse.stock_num -= 1

    클래슀 λ³€μˆ˜ stock_num = 0 을 μ„ μ–Έν•˜κ³  값을 μ΄ˆκΈ°ν™”ν–ˆλ‹€. __del__()은 μΈμŠ€ν„΄μŠ€κ°€ μ’…λ£Œλ λ•Œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ΄λ‹€.

     

    user1 = Warehouse('Kim')
    user2 = Warehouse('Park')

    2λͺ…μ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.

     

    print(user1.name)
    print(user2.name)
    print(user1.__dict__)
    print(user2.__dict__)
    print(Warehouse.__dict__)

    __dict__() λ©”μ†Œλ“œλ‘œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 확인해보면 각각 μ΄λ¦„λ§Œ 좜λ ₯λœλ‹€. 클래슀λͺ…μœΌλ‘œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 찍어보면 클래슀 λ³€μˆ˜stock_num=2 도 좜λ ₯λœλ‹€. 2개의 μΈμŠ€ν„΄μŠ€κ°€ ν΄λž˜μŠ€λ³€μˆ˜λ₯Ό κ³΅μœ ν•˜κ³  μžˆλ‹€λŠ” κ±Έ μ•Œ 수 μžˆλ‹€.

     

    print(user1.stock_num)
    print(user2.stock_num)

    μΈμŠ€ν„΄μŠ€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—λŠ” μ € 클래슀 λ³€μˆ˜κ°€ 좜λ ₯λ˜μ§€ μ•Šμ•˜λ‹€. ν•˜μ§€λ§Œ μΈμŠ€ν„΄μŠ€μ—μ„œ 클래슀 λ³€μˆ˜λ₯Ό 찍어보면 값이 좜λ ₯λœλ‹€. ν΄λž˜μŠ€λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ λ˜λŠ” λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ΄λ‹€. 자기 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ—†μœΌλ©΄ 클래슀 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ°ΎλŠ”λ‹€. 거기에도 μ—†μœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

    λ‚˜μ€‘μ— λ°°μš°κ² μ§€λ§Œ del user1 을 μ‚¬μš©ν•˜λ©΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μ§€μšΈ 수 μžˆλ‹€. user1 μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜ μ§€μš°κ³  print(user2.stock_num) 좜λ ₯해보면 μˆ«μžκ°€ 1둜 쀄어든걸 λ³Όμˆ˜μžˆλ‹€. 지웠을 땐 def __del__(self) ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ–΄μ„œ stock_num을 ν•˜λ‚˜ κ°μ†Œν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

     

     

    객체와 μΈμŠ€ν„΄μŠ€μ˜ 차이 (점프 투 파이썬)

    클래슀둜 λ§Œλ“  객체λ₯Ό μΈμŠ€ν„΄μŠ€λΌκ³ λ„ ν•œλ‹€. a = Cookie() μ—μ„œ aλŠ” 객체. aκ°μ²΄λŠ” Cookie() 클래슀의 μΈμŠ€ν„΄μŠ€μ΄λ‹€. μΈμŠ€ν„΄μŠ€λŠ” νŠΉμ • 객체가 μ–΄λ–€ 클래슀의 객체인지 관계 μœ„μ£Όλ‘œ μ„€λͺ…ν•  λ•Œ μ‚¬μš©ν•œλ‹€. `aλŠ” μΈμŠ€ν„΄μŠ€λ‹€` λ³΄λ‹€λŠ” `aλŠ” 객체닀` λΌλŠ” ν‘œν˜„μ΄ μ–΄μšΈλ¦¬λ©° `aλŠ” μΏ ν‚€μ˜ 객체` λ³΄λ‹€λŠ” `aλŠ” μΏ ν‚€μ˜ μΈμŠ€ν„΄μŠ€`λΌλŠ” ν‘œν˜„μ΄ μ–΄μšΈλ¦°λ‹€.

     

     

     

    상속

    νŒŒμ΄μ¬μ€ μžλ°”μ™€ λ‹€λ₯΄κ²Œ 닀쀑상속을 ν—ˆμš©ν•œλ‹€. 상속을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλ‹€. λΆ€λͺ¨ν΄λž˜μŠ€μ—μ„œ 곡톡 속성을 μ •μ˜ν•˜κ³  μƒμ†λ°›λŠ” μ„œλΈŒν΄λž˜μŠ€μ—μ„œ κ·Έκ±Έ μ‚¬μš©ν•œλ‹€.

     

    class Car:
        """Parent Class"""  #보톡 μ΄λ ‡κ²Œ ν‘œμ‹œν•΄μ€€λ‹€
        def __init__(self, tp, color):
            self.tp = tp
            self.color = color
        def show(self):
            return 'car class show method'
    
    class BmwCar(Car):

    μ„œλΈŒν΄λž˜μŠ€μ˜ μΈμžμ— λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό λ„£μ–΄μ£Όλ©΄ μƒμ†ν‘œμ‹œκ°€ 되고 μ‚¬μš©κ°€λŠ₯해진닀.

     

    class BmwCar(Car):
        """sub Class"""
        def __init__(self, car_name, tp, color):
            super().__init__(tp, color)
            self.car_name = car_name
    
        def show_model(self) -> None:
            return "Your car name: %s" % self.car_name

    λΆ€λͺ¨μ—μ„œ 상속받은 λ©”μ†Œλ“œλŠ” super()둜 μ΄ˆκΈ°ν™”ν•˜κ³  μžμ‹ μ˜ λ©”μ†Œλ“œλŠ” self둜 μ΄ˆκΈ°ν™”λ₯Ό ν•œλ‹€. -> None 은 리턴할 게 μ—†λ‹€λŠ” λœ»μ΄λ‹€.

     

    model1 = BmwCar('520d', 'sedan', 'red')
    
    print(model1.color) #super
    print(model1.tp) #super
    print(model1.car_name) #sub
    print(model1.show()) #super
    print(model1.show_model()) #sub
    print(model1.__dict__)

    μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜κ³  λ©”μ†Œλ“œ μ‚¬μš©ν•΄λ³΄κΈ°

     

     

    μ˜€λ²„λΌμ΄λ”©

    #벀츠에 λ©”μ†Œλ“œ μΆ”κ°€
    
    def show(self):
            return 'Car Info : %s %s %s' % (self.car_name, self.tp, self.color)
    
    # Method Overriding
    model2 = BenzCar("220d", "suv", "black")
    print(model2.show())

    λΆ€λͺ¨μ˜ λͺ¨λ“  λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ 상속받을 건 λ°›κ³  λ‚΄μš©μ„ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

    def show(self):
            print(super().show())
            return 'Car Info : %s %s %s' % (self.car_name, self.tp, self.color)
    
    # Parent Method Call
    model3 = BenzCar("350s", 'sedan', 'silver')
    print(model3.show())

    λΆ€λͺ¨μ˜ show λ©”μ†Œλ“œλ₯Ό 좜λ ₯ν•˜κ³  싢을 λ•Œ, super ν‚€μ›Œλ“œλ‘œ μ ‘κ·Όν•˜λ©΄ λœλ‹€.

    # Inheritance Info
    print(BmwCar.mro())
    
    >>> [<class '__main__.BmwCar'>, <class '__main__.Car'>, <class 'object'>]

    mro() λ©”μ†Œλ“œλŠ” 상속관계λ₯Ό 리슀트 ν˜•νƒœλ‘œ 보여쀀닀. λͺ¨λ“  ν΄λž˜μŠ€λŠ” 였브젝트 클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€.

     

     

    닀쀑상속

    class X():
        pass
    
    class Y():
        pass
    
    class Z():
        pass
    
    class A(X,Y):
        pass
    
    class B(Y,Z):
        pass
    
    class M(B, A, Z):
        pass
    
    print(M.mro())

    클래슀 M은 μœ„μ— μžˆλŠ” λͺ¨λ“  클래슀λ₯Ό 상속받은 거라 λ‹€μ€‘μƒμ†λœ μƒνƒœμ΄λ‹€.

    [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>,
    <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]

    M의 μƒμ†κ΄€κ³„λŠ” μ΄λŸ¬ν•˜λ‹€. ν•˜μ§€λ§Œ λ„ˆλ¬΄ λ³΅μž‘ν•˜κ³  κΉŠμ€ κ΄€κ³„λŠ” 쒋지 μ•Šλ‹€.

     

     

     

    😜 NEXT : 파이썬 λͺ¨λ“ˆκ³Ό νŒ¨ν‚€μ§€ κ³΅λΆ€ν•˜κΈ°

    λ°˜μ‘ν˜•

    λŒ“κΈ€

κ°œλ°œκ³΅λΆ€