런타임에 속성을 동적으로 교체하는 것을 원숭이 패치라고 합니다.
몽키 패치라고 불리는 이유는 무엇입니까?
런타임 속성 대체는 몽키 패치와 관련이 없습니다. 인터넷에서 발견된 몽키 패치의 유래에 대해서는 두 가지 의견이 있습니다.
1. 게릴라패치(Guerrilla Patch)는 잡군과 게릴라군이라는 뜻으로 이 부분이 독창적이지 않음을 나타낸다. 영어로 게릴라의 발음은 골리아(오랑우탄)와 비슷하다가 나중에는 원숭이(원숭이)로 표기됐다.
2. 또 다른 설명으로는 이 방법이 원본 코드를 엉망으로 만들기 때문에(messing with it) 영어로 Monkeying About(naughty)이라고 하여 Monkey Patch라고 합니다.
멍키 패치의 이름은 "모듈 런타임 교체 기능"에 해당하는 만큼 다소 혼란스럽습니다.
monkey 패치 사용
1. 런타임에 모듈을 동적으로 교체하는 방법
스택오버플로에는 두 가지 인기 있는 예가 있습니다.
consider a class that has a method get_data. This method does an external lookup (on a database or web API, for example), and various other methods in the class call it. However, in a unit test, you don't want to depend on the external data source - so you dynamically replace the get_data method with a stub that returns some fixed data.
클래스에 get_data 메서드가 있다고 가정합니다. 이 메서드는 일부 외부 쿼리(예: 데이터베이스 또는 웹 API 쿼리 등)를 수행하고 클래스의 다른 많은 메서드에서 이를 호출합니다. 그러나 단위 테스트에서는 외부 데이터 소스에 의존하고 싶지 않습니다. 따라서 이 get_data 메소드를 일부 테스트 데이터만 반환하는 멍청한 메소드 상태로 대체합니다.
인용된 또 다른 예는 Zope 위키의 Monkey Patch에 대한 설명입니다.
from SomeOtherProduct.SomeModule import SomeClass def speak(self): return "ook ook eee eee eee!" SomeClass.speak = speak
더 실용적인 예도 있습니다. 많은 코드에서 import json을 사용하는 경우 나중에 ujson의 성능이 더 높다는 것을 알았습니다. file ujson을 json으로 가져오도록 변경하는 비용이 더 높거나, json을 ujson으로 바꾸는 것이 기대치를 충족하는지 테스트하려면 다음만 추가하면 됩니다.
import json import ujson def monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch_json()
2. 런타임 시 동적으로 모듈을 추가하는 방법
예를 들어, 팀의 공용 라이브러리에 있는 모듈을 참조하고 모듈의 기능을 강화하려는 경우 상속 외에도 Monkey Patch 사용을 고려할 수도 있습니다.
개인적으로는 Monkey Patch가 편리함을 제공하지만 소스 코드의 우아함을 망칠 위험도 있다고 생각합니다.
PHP 중국어 웹사이트에는 무료 Python 비디오 튜토리얼이 많이 있습니다. 누구나 배울 수 있습니다!
이 기사는 https://www.jianshu.com/p/a19f936471e4
에서 복제되었습니다.위 내용은 Python에서 원숭이 패치란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!