파이썬 - 반사

안녕하세요, 미래의 파이썬 마법사 여러분! 오늘, 우리는 파이썬 반사의 마법의 세계로 흥미진진한 여정을 떠날 거예요. 반사라는 단어를 들어본 적이 없다고 해도 걱정 마세요. 이 튜토리얼이 끝날 때까지 여러분은 프로처럼 반사를 할 준비가 될 거예요! 그럼, 여러분의 마법봉을 준비해요 (저는 키보드라고 말이죠), 이제 시작해볼까요!

Python - Reflection

반사란 무엇인가요?

시작하기 전에, 반사란 무엇인지 이해해볼까요. 프로그래밍에서 반사는 프로그램이 자신의 구조와 동작을 실행 시간 중에 검사하고, 자기省察하고, 수정할 수 있는 거울과 같은 것입니다. 이는 여러분의 코드가 자신을 볼 수 있는 능력을 주는 것과 같아요. "제가 무엇으로 만들어졌니?"라고 말할 수 있죠. 정말 멋질 텐데요?

type() 함수

type() 함수부터 시작해볼게요. 이는 객체에게 "너는 무엇이니?"라고 물어보는 것과 같아요.

# 예제 1: type() 사용
x = 5
y = "Hello"
z = [1, 2, 3]

print(type(x))  # 출력: <class 'int'>
print(type(y))  # 출력: <class 'str'>
print(type(z))  # 출력: <class 'list'>

이 예제에서, 우리는 다른 변수들에게 무엇인지 묻고 있어요. type() 함수는 x가 정수, y가 문자열, z가 리스트라고 알려줍니다. 변수들과 대화를 하고 있는 것과 같아요!

isinstance() 함수

다음은 isinstance() 함수예요. 이 함수는 "너는 이 가족의 일부니?"라고 묻는 것과 같아요.

# 예제 2: isinstance() 사용
x = 5
y = "Hello"

print(isinstance(x, int))    # 출력: True
print(isinstance(y, str))    # 출력: True
print(isinstance(x, str))    # 출력: False

여기서, 우리는 xint의 인스턴스인지 (그렇다), ystr의 인스턴스인지 (그렇다), xstr의 인스턴스인지 (그렇지 않다)를 확인하고 있어요. "너는 이 클럽의 회원이니?"라고 물어보는 것과 같아요!

issubclass() 함수

그 다음은 issubclass() 함수예요. 이는 "너는 이 가족과 관련이 있니?"라고 묻는 것과 같아요.

# 예제 3: issubclass() 사용
class Animal:
pass

class Dog(Animal):
pass

print(issubclass(Dog, Animal))  # 출력: True
print(issubclass(Animal, Dog))  # 출력: False

이 예제에서, 우리는 DogAnimal의 서브클래스인지 (그렇다), AnimalDog의 서브클래스인지 (그렇지 않다)를 확인하고 있어요. "포메라니안은 강아지의 일종이니?"와 "모든 강아지는 포메라니안이니?"라고 물어보는 것과 같아요!

callable() 함수

이제 callable() 함수에 대해 이야기해볼게요. 이 함수는 객체가 함수처럼 호출될 수 있는지 확인합니다.

# 예제 4: callable() 사용
def greet():
print("Hello!")

x = 5

print(callable(greet))  # 출력: True
print(callable(x))      # 출력: False

여기서, 우리는 greet(함수입니다)가 호출 가능한지, x(그저 숫자일 뿐)가 호출 가능한지를 확인하고 있어요. "너를 함수로 사용할 수 있니?"라고 묻는 것과 같아요!

getattr() 함수

getattr()는 객체에게 그의 어트리뷰트를 물어보는 고양의 방법과 같아요.

# 예제 5: getattr() 사용
class Person:
name = "Alice"
age = 30

p = Person()
print(getattr(p, "name"))  # 출력: Alice
print(getattr(p, "job", "Unemployed"))  # 출력: Unemployed

이 예제에서, 우리는 우리의 Person 객체에게 name 어트리뷰트를 물어보고 있어요. 그리고 job 어트리뷰트는 없어서 기본값으로 "Unemployed"를 제공합니다.

setattr() 함수

setattr()는 객체에게 새로운 어트리뷰트를 주거나 기존 어트리뷰트를 변경하는 것과 같아요.

# 예제 6: setattr() 사용
class Car:
color = "red"

my_car = Car()
print(my_car.color)  # 출력: red

setattr(my_car, "color", "blue")
print(my_car.color)  # 출력: blue

setattr(my_car, "brand", "Toyota")
print(my_car.brand)  # 출력: Toyota

여기서, 우리는 우리의 차의 color을 빨간색에서 파란색으로 변경하고, 새로운 brand 어트리뷰트를 주고 있어요.

hasattr() 함수

hasattr()는 객체에게 "이 어트리뷰트를 가지고 있니?"라고 묻는 것과 같아요.

# 예제 7: hasattr() 사용
class Book:
title = "Python for Beginners"
pages = 200

my_book = Book()
print(hasattr(my_book, "title"))   # 출력: True
print(hasattr(my_book, "author"))  # 출력: False

이 예제에서, 우리는 우리의 Book 객체가 title 어트리뷰트를 가지고 있는지 (그렇다)와 author 어트리뷰트를 가지고 있는지 (그렇지 않다)를 확인하고 있어요.

dir() 함수

마지막으로 dir() 함수를 살펴보죠. 이 함수는 객체에게 "너는 무엇을 할 수 있니?"라고 묻는 것과 같아요.

# 예제 8: dir() 사용
class Dog:
def __init__(self, name):
self.name = name

def bark(self):
print("Woof!")

my_dog = Dog("Buddy")
print(dir(my_dog))

이 코드는 우리의 Dog 객체의 모든 어트리뷰트와 메서드를 포함한 목록을 출력합니다. namebark뿐만 아니라 모든 객체가 가지고 있는 내장 어트리뷰트들도 포함됩니다.

반사 함수 요약

여기서는 우리가 다룬 모든 반사 함수의 요약을 보여드릴게요:

함수 목적
type() 객체의 타입을 반환합니다
isinstance() 객체가 지정된 클래스의 인스턴스인지 확인합니다
issubclass() 클래스가 다른 클래스의 서브클래스인지 확인합니다
callable() 객체가 함수처럼 호출 가능한지 확인합니다
getattr() 객체의 어트리뷰트의 값을 가져옵니다
setattr() 객체의 어트리뷰트의 값을 설정합니다
hasattr() 객체가 특정 어트리뷰트를 가지고 있는지 확인합니다
dir() 객체의 어트리뷰트와 메서드의 목록을 반환합니다

그리고 그렇게 끝납니다, 여러분! 여러분은 파이썬 반사의 세계로 첫 걸음을 내딛었어요. 이 도구들은 여러분의 코드와 대화를 할 수 있는 것과 같아요. 여러분의 프로그램들이 자신을 검사하고, 발견한 것을 기반으로 결정을 내릴 수 있게 해줍니다. 이는 여러분의 코드를 더 유연하고 동적으로 만드는 강력한 기능입니다.

파이썬의 여정을 계속하면서, 여러분은 반사를 사용하여 더 더 스마트하고 유연한 프로그램을 만드는 더 많은 방법을 찾을 거예요. 연습을 계속하고, 탐구하고, 가장 중요한 것은 파이썬을 즐기세요!

Credits: Image by storyset