μ½”λ“œ - 패캠 μˆ˜μ—… μ½”λ“œ μ°Έκ³  (패캠 μˆ˜μ—… 정리)

 

 

<이전 κΈ€>

https://silvercoding.tistory.com/39

 

[python 기초] 7. ν•¨μˆ˜ 및 λžŒλ‹€ (lambda)

μ½”λ“œ - 패캠 μˆ˜μ—… μ½”λ“œ μ°Έκ³  (패캠 μˆ˜μ—… 정리) <이전 κΈ€> https://silvercoding.tistory.com/38 https://silvercoding.tistory.com/37 https://silvercoding.tistory.com/36 https://silvercoding.tistory.com/35..

silvercoding.tistory.com

 

 

- λ³Έ ν¬μŠ€νŒ…μ—μ„œ λ‹€λ£° λ‚΄μš© μš”μ•½ 

* 클래슀 λ³€μˆ˜ & μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 차이 (μ€‘μš”)

* 클래슀 λ³€μˆ˜ : 직접 μ‚¬μš© κ°€λŠ₯, 객체보닀 λ¨Όμ € 생성 

* μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : 객체 λ§ˆλ‹€ λ³„λ„λ‘œ 쑴재, μΈμŠ€ν„΄μŠ€ 생성 ν›„ μ‚¬μš© 

* λ„€μž„μŠ€νŽ˜μ΄μŠ€ : 객체λ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•  λ•Œ μ €μž₯된 곡간 ( (ex)이름, μ£Όμ†Œ, .... -> 독립적인 곡간 )   

* 클래슀 상속과 닀쀑 상속 

 

 

* 클래슀 μ„ μ–Έ

class 클래슀λͺ…:

    ν•¨μˆ˜

    ν•¨μˆ˜

    ν•¨μˆ˜ 

 

 

 

 

 [클래슀 κΈ°λ³Έ μ‚¬μš©] 

- 예제 1 

class UserInfo:
    # 속성, λ©”μ†Œλ“œ 
    def __init__(self, name):
        self.name = name
        print("μ΄ˆκΈ°ν™”", name)

    def user_info_p(self):
        print('Name : ', self.name)

μ΄ˆκΈ°μ— name을 λ°›λŠ” 클래슀 UserInfoλ₯Ό μ„ μ–Έν•œλ‹€. user_info_pλ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ self.name이 좜λ ₯λœλ‹€. 

user1 = UserInfo('Silver')
print(user1.name)
user1.user_info_p()

 μ΄ˆκΈ°ν™” Silver 
 Silver 
 Name :  Silver 

user2 = UserInfo('Park')
print(user1.name)
user2.user_info_p()

 μ΄ˆκΈ°ν™” Park 
 Park 
 Name :  Park 

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

 2535817860096 
 2535817860544 

같은 ν΄λž˜μŠ€μ—μ„œ λ‚˜μ™”μ§€λ§Œ user1κ³Ό user2 λŠ” μ„œλ‘œ λ‹€λ₯΄λ‹€. id값이 λ‹€λ₯΄λ‹€λŠ” κ²ƒμœΌλ‘œ 증λͺ…ν•  수 μžˆλ‹€. 

 

 

 

* λ„€μž„μŠ€νŽ˜μ΄μŠ€ 확인 

print(user1.__dict__)
print(user2.__dict__)

 {'name': 'Silver'} 
 {'name': 'Park'} 

 __dict__ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 확인할 수 μžˆλ‹€. μ €μž₯된 λ³€μˆ˜μ™€ 값이 key, valueν˜•μ‹μΈ dictionary둜 좜λ ₯λœλ‹€. 

 

 

 

 

 

 

 

- 예제 2 

* self 의 이해 (클래슀 λ©”μ†Œλ“œ vs μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ) 

<μ°Έκ³  ν¬μŠ€νŒ…> 

https://silvercoding.tistory.com/20?category=957523 

 

[python 심화] 3. 클래슀 λ©”μ†Œλ“œ, μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ, μŠ€ν…Œμ΄ν‹± λ©”μ†Œλ“œ

μ½”λ“œ - 패캠 μˆ˜μ—… μ½”λ“œ μ°Έκ³  (패캠 μˆ˜μ—… 정리) <이전 κΈ€> https://silvercoding.tistory.com/19 https://silvercoding.tistory.com/18 [python 심화] 1. 객체지ν–₯(OOP), 클래슀 기초 μ‚¬μš© μ½”λ“œ - 패캠 μˆ˜μ—… μ½”λ“œ..

silvercoding.tistory.com

class SelfTest():
    def function1():
        print('function1 called ! ')

    def function2(self):
        print(id(self))
        print('function2 called ! ')

λ©”μ„œλ“œλ₯Ό 2개 생성해 μ€€λ‹€. functionn1은 selfλ₯Ό 인자둜 받지 μ•Šκ³ , function2λŠ” selfλ₯Ό 인자둜 λ°›λŠ”λ‹€. 이 κ²½μš°μ— 각 λ‘κ°œμ˜ λ©”μ„œλ“œμ— μ–΄λ–»κ²Œ μ ‘κ·Όν•˜λŠ”μ§€ μ‹€ν—˜ν•΄ λ³Έλ‹€. 

self_test = SelfTest()
self_test.function1()

 TypeError: function1() takes 0 positional arguments but 1 was given 

function1 ν•¨μˆ˜μ— μΈμŠ€ν„΄μŠ€λ‘œ μ ‘κ·Όν–ˆλ”λ‹ˆ TypeErrorκ°€ λ°œμƒν•˜κ²Œ λœλ‹€. selfλ₯Ό 인자둜 받지 μ•ŠκΈ° λ•Œλ¬Έμ— 클래슀 λ©”μ†Œλ“œμ΄κ³ , λˆ„κ΅¬(μ–΄λ–€ μΈμŠ€ν„΄μŠ€)의 function1 ν•¨μˆ˜μΈμ§€ λͺ¨λ₯΄λŠ” 것이닀. 

SelfTest.function1() # 클래슀 λ©”μ†Œλ“œ

 function1 called ! 

λ”°λΌμ„œ μ΄λ ‡κ²Œ 클래슀 자체둜 μ ‘κ·Όν•΄ μ£Όμ–΄μ•Ό 호좜이 κ°€λŠ₯ν•˜λ‹€. 

self_test.function2() # μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ 
print(id(self_test))

 1805035034104 
 function2 called ! 
 1805035034104 

반면 selfλ₯Ό 인자둜 λ°›μ•˜λ˜ function2 λ©”μ†Œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 호좜 κ°€λŠ₯ν•˜λ‹€. self의 idλ₯Ό 좜λ ₯ν•˜λ„λ‘ 생성 ν–ˆμ—ˆλŠ”λ°, self_test μΈμŠ€ν„΄μŠ€μ™€ id값이 같은 것을 λ³Ό 수 μžˆλ‹€. λ”°λΌμ„œ selfλ₯Ό 인자둜 λ°›λŠ” 클래슀의 λ©”μ†Œλ“œμ˜ 인자인 selfμ—λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ“€μ–΄κ°€κ²Œ λ˜λŠ” 것이닀. 

SelfTest.function2() # -> μ˜ˆμ™Έ

 TypeError: function2() missing 1 required positional argument: 'self' 

이처럼 μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ 클래슀 자체둜 μ ‘κ·Όν•˜λ©΄ λ˜‘κ°™μ΄ TypeErrorκ°€ λ‚˜κ²Œ λœλ‹€. 였λ₯˜ λ‚΄μš©μ— λ”°λ₯΄λ©΄ μΈμŠ€ν„΄μŠ€λ₯Ό μΈμžμ— λ„£μ–΄μ£Όλ©΄ 싀행될 것이닀. 

SelfTest.function2(self_test)  # μΈμžμ— μΈμŠ€ν„΄μŠ€ λ„£μ–΄μ£Όλ©΄ 클래슀자체둜 호좜 κ°€λŠ₯

 2385469756864 
 function2 called ! 

 

 

 

 

 

 

 

 

- 예제 3 

: 클래슀 λ³€μˆ˜ vs μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 

<μ°Έκ³  ν¬μŠ€νŒ…> 

https://silvercoding.tistory.com/19?category=957523 

 

[python 심화] 2. 클래슀 기초, 클래슀 λ³€μˆ˜ , μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

μ½”λ“œ - 패캠 μˆ˜μ—… μ½”λ“œ μ°Έκ³  (패캠 μˆ˜μ—… 정리) <이전 κΈ€> https://silvercoding.tistory.com/18 [python 심화] 1. 객체지ν–₯(OOP), 클래슀 기초 μ‚¬μš© μ½”λ“œ - 패캠 μˆ˜μ—… μ½”λ“œ μ°Έκ³  1. 객체지ν–₯ vs μ ˆμ°¨μ§€ν–₯ κ°„λ‹¨ν•œ..

silvercoding.tistory.com

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

    def __del__ (self):
        WareHouse.stock_num -= 1

클래슀 λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό 각각 생성해 μ£Όμ—ˆλ‹€. 

user1 = WareHouse('Kim')
user2 = WareHouse("Park")
user3 = WareHouse("Lee")

μΈμŠ€ν„΄μŠ€λ₯Ό 3개 λ§Œλ“€μ–΄ μ€€λ‹€. 

 

 

* μΈμŠ€ν„΄μŠ€ λ„€μž„μŠ€νŽ˜μ΄μŠ€, 클래슀 λ³€μˆ˜ (λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— 곡유) 

print(user1.__dict__)
print(user2.__dict__)
print(user3.__dict__)

 {'name': 'Kim'} 
 {'name': 'Park'} 
 {'name': 'Lee'} 

μœ„μ™€ 같이 μΈμŠ€ν„΄μŠ€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 좜λ ₯ν•˜λ©΄ name이 μ œλŒ€λ‘œ λ‚˜μ˜€λŠ” 것을 λ³Ό 수 μžˆλ‹€. 

print(user1.name)
print(user2.name)
print(user3.name)

 Kim 
 Park 
 Lee 

 

 

* 클래슀 λ„€μž„μŠ€νŽ˜μ΄μŠ€, 클래슀 λ³€μˆ˜ (λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— 곡유) 

print(WareHouse.__dict__)  # ---> 클래슀 자체의 λ„€μž„ μŠ€νŽ˜μ΄μŠ€μ—μ„œ ν΄λž˜μŠ€λ³€μˆ˜ 확인 κ°€λŠ₯

 {'__module__': '__main__', 'stock_num': 3, '__init__': <function WareHouse.__init__  
 at 0x0000022B69124510>, '__del__': <function WareHouse.__del__ at 0x0000022B69124598>, '__dict__': <attribute  '__di ct__' of 'WareHouse' objects>, '__weakref__': <attribute '__weakref__' of 'WareHouse' objects>, '__doc__': None} 

μ΄λ ‡κ²Œ 클래슀 λ³€μˆ˜λŠ” 클래슀의 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 찍어보면 확인할 수 μžˆλ‹€. 

 

print(user1.stock_num) # μžμ‹ μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ—†μœΌλ©΄ 클래슀의 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ°Ύκ³ , 클래슀의 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—λ„ μ—†μœΌλ©΄ κ·Έλ•Œ μ—λŸ¬κ°€ λ‚œλ‹€. 
print(user2.stock_num)
print(user3.stock_num)

 3 
 3 
 3 

클래슀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅ν•˜μ—¬ μ ‘κ·Όν•  μˆ˜λ„ μžˆλ‹€. 자기 μžμ‹ μ˜ μΈμŠ€ν„΄μŠ€ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ°ΎλŠ” λ³€μˆ˜κ°€ μ—†μœΌλ©΄ 클래슀의 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ°Ύκ³  , 클래슀의 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—λ„ ν•΄λ‹Ή λ³€μˆ˜κ°€ μ—†μœΌλ©΄ κ·Έλ•Œ 였λ₯˜κ°€ λ‚˜κ²Œ λ˜λŠ” 것이닀. 

 

del user1

del둜 user1을 μ§€μš°λ©΄, μœ„μ— μ„ μ–Έν•΄ 놓은 λŒ€λ‘œ sock_num 도 -1이 될 것이닀. 

# print(user1.stock_num)
print(user2.stock_num)
print(user3.stock_num)

 2 
 2 

 

 

 

 

 

 

 

 

 

 

 

 

 [클래슀 상속] 

- 예제 1 

* Car : λΆ€λͺ¨ 클래슀 

class Car: 
    """"Parent Class"""
    def __init__(self, tp, color):
        self.type = tp
        self.color = color

    def show(self):
        return 'Car Class "Show Method!"'

* BmwCar : μžμ‹ 클래슀 1

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

* BenzCar : μžμ‹ 클래슀 2

class BenzCar(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

    def show(self):
        print(super().show())
        return 'Car Info: %s %s %s' % (self.car_name, self.type, self.color)

 

* μ‚¬μš© 

model1 = BmwCar('520d', 'sedan', 'red')

μš°μ„  객체λ₯Ό 생성해 μ€€λ‹€. 

print(model1.color) # Super 
print(model1.type)  # Super
print(model1.car_name) # Sub
print(model1.show()) # Super    
print(model1.show_model()) # Sub
print(model1.__dict__)

 red 
 sedan 
 520d 
 Car Class "Show Method!" 
 Your Car Name : 520d 
 {'type': 'sedan', 'color': 'red', 'car_name': '520d'} 

λΆ€λͺ¨ν΄λž˜μŠ€μ—μ„œ μ„ μ–Έν•΄ λ†“μ•˜λ˜ color, typeλ³€μˆ˜μ™€ show() λ©”μ†Œλ“œκ°€ μ •μƒμ μœΌλ‘œ 좜λ ₯된 것을 λ³Ό 수 μžˆλ‹€. μΈμŠ€ν„΄μŠ€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—λ„ λ³€μˆ˜κ°€ λ“€μ–΄ κ°€ μžˆλ‹€. 

 

 

# Method Overriding (μ˜€λ²„λΌμ΄λ“œ : μ˜¬λΌνƒ€λ‹€)

model2 = BenzCar("220d", 'suv', 'black')
print(model2.show())

 Car Class "Show Method!" 
 Car Info: 220d suv black 

# Parent Method Call 
model3 = BenzCar('350s', 'sedan', 'silver')
print(model3.show())

 Car Class "Show Method!" 
 Car Info: 350s sedan silver 

BenzCar 클래슀의 show() λ©”μ†Œλ“œμ—μ„œ super.show()λ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•˜μ˜€λ‹€. λ”°λΌμ„œ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ„ μ–Έν•˜μ˜€λ˜ λ‚΄μš©λ„ ν•¨κ»˜ 좜λ ₯된 것을 λ³Ό 수 μžˆλ‹€. 

 

 

# Inheritance Info (상속정보 λ¦¬μŠ€νŠΈ ν˜•νƒœλ‘œ λ‚˜μ˜΄)

print(BmwCar.mro())  # 상속 관계λ₯Ό 보여쀀닀. 
print(BenzCar.mro())
# λͺ¨λ“  ν΄λž˜μŠ€λŠ” objectλ₯Ό μƒμ†λ°›λŠ”λ‹€.

 [<class '__main__.BmwCar'>, <class '__main__.Car'>, <class 'object'>] 
 [<class '__main__.BenzCar'>, <class '__main__.Car'>, <class 'object'>] 

mro ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 상속 관계λ₯Ό 리슀트둜 좜λ ₯ν•΄λ³Ό 수 μžˆλ‹€. λͺ¨λ“  ν΄λž˜μŠ€λŠ” objectλ₯Ό 상속 λ°›λŠ” 것 λ˜ν•œ μ•Œμ•„λ‘κΈ° ! 

 

 

 

 

 

 

- 예제 2 : 닀쀑 상속 

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

μš°μ„  클래슀 X, Y, Zλ₯Ό μ„ μ–Έν•˜κ³ , AλŠ” X, Yλ₯Ό , BλŠ” Y, Z λ₯Ό , M은 B, A, Z λ₯Ό 닀쀑상속 λ°›λŠ”λ‹€. 이 λ•Œμ˜ Inheritance Infoλ₯Ό 좜λ ₯ν•΄ 보자. 

print(M.mro())
print(A.mro())

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

이처럼 닀쀑상속이 κ°€λŠ₯ν•˜μ§€λ§Œ , λ„ˆλ¬΄ 많이 상속 λ°›κ²Œ 되면 μ½”λ“œλ₯Ό ν•΄μ„ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€μ–΄μ§ˆ μˆ˜λ„ μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λœλ‹€. 

 

 

+ Recent posts