# 원래 클래스 정의
class Person:
def greet(self):
return "Hello!"
# 기존 메서드 실행
p = Person()
print(p.greet()) # 출력 Hello!
# 몽키 패칭을 이용한 새로운 메서드 정의
def new_greet(self):
return "Hi, there! I am patched."
# 기존 greet 메서드를 새로운 new_greet로 교체
Person.greet = new_greet
# 변경된 greet 메서드 실행
print(p.greet()) # 출력 : Hi, there! I am patched.
Person
클래스의 greet()
메서드는 "Hello!"를 반환한다.greet()
메서드를 new_greet()
로 바꾸면, 새로운 함수로 동작하게 된다.p.greet()
를 실행하면 새로운 메시지가 출력된다.requests
라이브러리 패칭 (API 호출 테스트)
import requests
#원래 requests.get() 함수의 동작
def original_request():
response = requests.get("https://example.com")
return response.status_code
print(original_request()) # 실제 사이트 요청 -> 200(성공) 또는 기타 상태 코드
# Monkey Patching 적용
def fake_request(url):
class FakeResponse:
status_code = 200 # 항상 200을 반환하는 가짜 응답
return FakeRespoinse()
# requests.get()을 fake_requests로 교체
requests.get = fake_request
# 이제 원래 요청을 실행해도 가짜 응답이 반환됨
print(original_request()) # 출력 : 200
requests.get()
을 직접 호출하면 실제 네트워크 요청이 발생합니다.requests.get
을 fake_request
함수로 교체하면, 네트워크 요청 없이도 테스트가 가능하다.기본 로깅 시스템이 있고, 플러그인을 통해 새로운 로깅 기능을 추가하는 방식
# 원래 시스템 코드 (기본 로거)
class Logger:
def log(self, message):
print(f"[LOG] {message}")
# 기존 로깅 시스템 사용
logger = Logger()
logger.log("Hello, world!") # 출력 : [LOG] Hello, world!
Logger.log()
는 단순한 텍스트 로그만 출력한다.이제 플러그인을 이용해 동작 중 로그를 파일에도 저장하도록 변경해 본다.
# 플러그인 적용 - 기존 log 메서드를 확장하는 새로운 기능
def log_with_file(self, message):
# 원래 콘솔 출력 기능
print(f"[LOG] {message}")
# 추가 기능 : 로그를 파일에 저장
def open("log.txt", "a") as file:
file.write(f"{message}\n")
# 몽키 패칭을 사용해 기존 log 메서드 변경
Logger.log = log_with_file
#새로운 기능이 적용된 로거 실행
logger.log("This is a test log.")
# 출력 : [LOG] This is a test log.
# log.txt 파일에 "This is a test log." 저장됨
<기존 AI 모델 코드>
import random
class AIModel:
def predict(self, input_data):
# 가짜 예측 점수 (0-1 사이의 랜덤값)
return random.random()
# 기존 모델 동작
model = AIModel()
print(model.predict("input")) # 예 : 0.756
이 모델은 단순히 0~1 사이의 랜덤 숫자를 반환하는 가짜 모델
<몽키 패칭 적용 - 특정 임계값 이상이면 자동 로깅>
# 원래 predict 메서드 백업
original_predict = AIModel_predict
# 새로운 로깅 기능 추가
def predict_with_logging(self, input_data):
result = original_predict(self, input_data) # 기존 예측 수행
if result > 0.8:
with open("high_confidence_predictions.txt", "a" as file:
file.write(f"Input : {input_data}, Prediction: {result}\n")
print(f"Logged high confidence prediction: {result}")
return result
# 몽키 패칭 적용
AIModel.predict = predict_with_logging
# 테스트 실행
print(model.predict("test input") # 특정 조건에서 로그 저장
[변경된 기능]
predict()
기능은 유지하면서 예측 점수가 0.8 이상이면 자동으로 데이터를 파일에 기록[활용 예시]
<기존 게임 엔진 코드>
class Game:
def boss_defeated(self, player):
print(f"{player} has defeated the boss!")
# 기본 게임 동작
game = Game()
game.boss_defeated("Player1")
<몽키 패칭 적용 - 보스 처치 시 추가 보상 지급>
# 원래 메서드 백업
origin_boss_defeated = Game.boss_defeated
# 새로운 기능 추가
def boss_defeated_with_reward(self, player):
original_Boss_defeated(self, player) # 기본 동작 유지
print(f"{player} received a legendary item as a reward!") # 추가 기능
# 몽키 패칭 적용
Game.boss_defeated = boss_defeated_with_reward
# 테스트 실행
game.boss_defeated("Player1")
# 출력:
# Player1 has defeated the boss!
# Player1 received a legendary item as a reward!
[변경된 기능]
[활용 예시]
즉, 기존 기능을 유지하면서 추가 기능만 구현 가능하다.
애플리케이션 실행 중에 새로운 기능을 추가할 수 있는 것이 장점