Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist Monkey Patching in Python?

Was ist Monkey Patching in Python?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼nach vorne
2020-01-04 17:45:503085Durchsuche

Was ist Monkey Patching in Python?

Das dynamische Ersetzen von Attributen zur Laufzeit wird als Monkey Patch bezeichnet.

Warum heißt es Monkey Patch?

Das Ersetzen von Attributen zur Laufzeit hat nichts mit Monkeys zu tun. Über den Ursprung gibt es zwei Meinungen von „affe patch“ online gefunden. :

1. Dieses Wort war ursprünglich „Guerrilla Patch“, eine Mischung aus „Armee“ und „Guerilla-Armee“, was bedeutet, dass dieser Teil im Englischen nicht „original“ ist ( Gorilla), und später wurde es als Affe (Affe) geschrieben.

2. Eine weitere Erklärung ist, dass diese Methode im Englischen Monkeying about (naughty) und daher Monkey Patch heißt, weil sie den ursprünglichen Code durcheinander bringt.

Der Name des Monkey-Patches ist etwas verwirrend, solange er der „Modul-Laufzeit-Ersatzfunktion“ entspricht.

Verwendung von Monkey Patch

1. Methode zum dynamischen Ersetzen von Modulen zur Laufzeit

Stackoverflow Oben gibt es zwei beliebte Beispiele.

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.

Angenommen, eine Klasse hat eine Methode get_data. Diese Methode führt einige externe Abfragen durch (z. B. Abfragen der Datenbank oder der Web-API usw.) und wird von vielen anderen Methoden in der Klasse aufgerufen. Bei einem Unit-Test möchten Sie sich jedoch nicht auf externe Datenquellen verlassen. Sie ersetzen also diese get_data-Methode durch einen dummen Methodenstatus, der lediglich einige Testdaten zurückgibt.

Ein weiteres zitiertes Beispiel ist die Erklärung von Monkey Patch im Zope-Wiki:

from SomeOtherProduct.SomeModule import SomeClass
def speak(self):
    return "ook ook eee eee eee!"
SomeClass.speak = speak

Es gibt auch ein praktischeres Beispiel. Später wurde festgestellt, dass ujson höher ist Wenn Sie der Meinung sind, dass es teurer ist, den Import-JSON jeder Datei zu ändern, um UJSON als JSON zu importieren, oder wenn Sie testen möchten, ob das Ersetzen von JSON durch UJSON wie erwartet ist, müssen Sie nur Folgendes hinzufügen:

import json
import ujson
def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads
monkey_patch_json()

2. Es gibt viele Möglichkeiten, Module während der Laufzeit dynamisch hinzuzufügen

Dieses Szenario kommt auch häufig vor, wenn wir beispielsweise auf ein Modul in der allgemeinen Bibliothek des Teams verweisen und dieses anreichern möchten Für die Funktionen des Moduls können wir neben der Vererbung auch die Verwendung von Monkey Patch in Betracht ziehen.

Ich persönlich bin der Meinung, dass Monkey Patch zwar Komfort bietet, aber auch die Gefahr birgt, die Eleganz des Quellcodes zu beeinträchtigen.

PHP-Website auf Chinesisch, es gibt viele kostenlose Python-Video-Tutorials, jeder ist herzlich zum Lernen eingeladen!

Dieser Artikel wurde reproduziert von: https://www.jianshu.com/p/a19f936471e4

Das obige ist der detaillierte Inhalt vonWas ist Monkey Patching in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jianshu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen