🐍 νŒŒμ΄μ¬μ—μ„œ isinstance vs issubclass μ™„λ²½ κ°€μ΄λ“œ

SueΒ·2025λ…„ 8μ›” 5일
0

Effective Python

λͺ©λ‘ 보기
6/9
post-thumbnail

🐍 νŒŒμ΄μ¬μ—μ„œ isinstance vs issubclass μ™„λ²½ κ°€μ΄λ“œ

νŒŒμ΄μ¬μ—μ„œλŠ” κ°μ²΄λ‚˜ 클래슀의 νƒ€μž…μ„ 확인할 λ•Œ isinstance와 issubclassλ₯Ό 자주 μ‚¬μš©ν•©λ‹ˆλ‹€.

두 ν•¨μˆ˜λŠ” λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ ν™•μΈν•˜λŠ” λŒ€μƒκ³Ό μš©λ„κ°€ λ‹€λ¦…λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” 두 ν•¨μˆ˜μ˜ 차이, μ‚¬μš©λ²•, 비ꡐλ₯Ό μ΄ˆλ³΄μžλ„ 이해할 수 μžˆλ„λ‘ μ‰½κ²Œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.


βœ… 1. isinstance(obj, classinfo) β€” 객체가 νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€ 확인

πŸ“Œ κ°œλ…

  • isinstance(객체, 클래슀)
  • 객체가 νŠΉμ • 클래슀(λ˜λŠ” κ·Έ ν•˜μœ„ 클래슀)의 μΈμŠ€ν„΄μŠ€μΈμ§€ 검사.

🧩 기본 예제

class Animal: pass
class Dog(Animal): pass

dog = Dog()

print(isinstance(dog, Dog))      # βœ… True
print(isinstance(dog, Animal))   # βœ… True (Dog은 Animal의 ν•˜μœ„ 클래슀)
print(isinstance(dog, object))   # βœ… True (λͺ¨λ“  ν΄λž˜μŠ€λŠ” object 상속)
print(isinstance(dog, str))      # ❌ False

βœ… νŠΉμ§•

  • 객체와 클래슀 관계λ₯Ό 확인.
  • 상속 관계도 인정 β†’ ν•˜μœ„ 클래슀 μΈμŠ€ν„΄μŠ€λ„ μƒμœ„ 클래슀둜 인정.

λ˜ν•œ, 두 번째 인자둜 νƒ€μž… νŠœν”Œμ„ λ„£μœΌλ©΄ μ—¬λŸ¬ νƒ€μž… 쀑 ν•˜λ‚˜λΌλ„ μΌμΉ˜ν•˜λ©΄ Trueλ₯Ό λ¦¬ν„΄ν•œλ‹€.

x = 42
print(isinstance(x, int))         # True
print(isinstance(x, (str, int)))  # True (intκ°€ ν¬ν•¨λ˜μ–΄ 있음)
print(isinstance(x, str))         # False

μ‚¬μš©ν•˜λŠ” μ΄μœ λ‘œλŠ” νƒ€μž… 검증 μ‹œ type(obj) == int보닀 μœ μ—°ν•˜λ©°, 상속 κ΄€κ³„κΉŒμ§€ 확인할 수 있기 λ•Œλ¬Έμ΄λ‹€.


βœ… 2. issubclass(class, classinfo) β€” ν΄λž˜μŠ€κ°€ νŠΉμ • 클래슀의 ν•˜μœ„ ν΄λž˜μŠ€μΈμ§€ 확인

πŸ“Œ κ°œλ…

  • issubclass(클래슀, 클래슀)
  • ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 ν•˜μœ„ ν΄λž˜μŠ€μΈμ§€ 검사.

🧩 기본 예제

class Animal: pass
class Dog(Animal): pass

print(issubclass(Dog, Animal))   # βœ… True
print(issubclass(Animal, Dog))   # ❌ False
print(issubclass(Dog, object))   # βœ… True (λͺ¨λ“  ν΄λž˜μŠ€λŠ” object ν•˜μœ„)

βœ… νŠΉμ§•

  • 클래슀 κ°„ 상속 관계λ₯Ό 확인.
  • 첫 번째 μΈμžλŠ” λ°˜λ“œμ‹œ ν΄λž˜μŠ€μ—¬μ•Ό ν•œλ‹€.

βœ… 3. 두 ν•¨μˆ˜μ˜ 차이

ꡬ뢄isinstanceissubclass
확인 λŒ€μƒκ°μ²΄ vs 클래슀클래슀 vs 클래슀
λ°˜ν™˜ κ°’True / FalseTrue / False
상속 κ΄€κ³„ν•˜μœ„ 클래슀 μΈμŠ€ν„΄μŠ€λ„ Trueν•˜μœ„ 클래슀이면 True
μ˜ˆμ‹œisinstance(dog, Animal) β†’ Trueissubclass(Dog, Animal) β†’ True

βœ… 4. νŠœν”Œλ‘œ μ—¬λŸ¬ 클래슀 확인 κ°€λŠ₯

두 ν•¨μˆ˜ λͺ¨λ‘ 두 번째 μΈμžμ— 클래슀 νŠœν”Œμ„ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

🧩 예제

class Animal: pass
class Dog(Animal): pass
class Cat(Animal): pass

dog = Dog()

# isinstance
print(isinstance(dog, (Dog, Cat)))    # βœ… True (Dog 포함)

# issubclass
print(issubclass(Dog, (Animal, str))) # βœ… True (Animal 포함)

βœ… 5. μ‹€μ „ μ‚¬μš© μ‹œ 주의점

  1. isinstanceλŠ” 객체 ν™•μΈμš©

  2. issubclassλŠ” 클래슀 ν™•μΈμš©

  3. type(obj) == Class λŒ€μ‹  isinstance(obj, Class) μ‚¬μš©

    • 이유: type()은 상속 관계λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠμŒ.
dog = Dog()
print(type(dog) == Animal)      # ❌ False
print(isinstance(dog, Animal))  # βœ… True

βœ… 6. μ‹€μ „ 예제: μ•ˆμ „ν•œ νƒ€μž… 검사

def process(animal):
    if isinstance(animal, Animal):
        print("동물 처리 쀑...")
    else:
        raise TypeError("Animal λ˜λŠ” ν•˜μœ„ 클래슀만 ν—ˆμš©λ©λ‹ˆλ‹€.")

process(Dog())    # βœ… 동물 처리 쀑...
process("cat")    # ❌ TypeError

🎯 정리

  • βœ… isinstance(obj, Class)
    β†’ 객체가 클래슀(λ˜λŠ” ν•˜μœ„ 클래슀) μΈμŠ€ν„΄μŠ€μΈμ§€ 확인

  • βœ… issubclass(Class1, Class2)
    β†’ Class1이 Class2의 ν•˜μœ„ ν΄λž˜μŠ€μΈμ§€ 확인

  • βœ… μ‚¬μš© κ°€μ΄λ“œ

    • 객체 β†’ isinstance
    • 클래슀 β†’ issubclass

πŸ’‘ 마무리

isinstance와 issubclassλŠ” λΉ„μŠ·ν•˜μ§€λ§Œ μš©λ„κ°€ λ‹€λ₯Έ νƒ€μž… 검사 λ„κ΅¬μž…λ‹ˆλ‹€.

  • 객체의 νƒ€μž… 확인 β†’ isinstance
  • 클래슀 κ°„ 상속 관계 확인 β†’ issubclass

이제 νƒ€μž… 검사 μ‹œ μ–Έμ œ μ–΄λ–€ ν•¨μˆ˜λ₯Ό 써야 ν• μ§€ λͺ…ν™•ν•΄μ‘Œμ„ κ²ƒμž…λ‹ˆλ‹€.


profile
AI/ML Engineer

0개의 λŒ“κΈ€