Ich habe C # geschrieben und das Mantra, das von oben kommt, scheint "verwende niemals Reflektion im Produktionscode". Ich habe es für Testcode verwendet, aber nie etwas, das in der Wildnis läuft. Alle Argumente scheinen vernünftig zu sein, und es gibt immer einen Weg, dies zu tun, indem man eine weitere Ebene der Abstraktion oder des Entwurfsmusters oder was auch immer hinzufügt.
Jetzt fange ich an, etwas ernsthaften Python-Code zu schreiben, ich frage mich, ob das gleiche Prinzip gilt. Es scheint, dass Python mit Reflektion konzipiert ist. Module und Klassen speichern Mitglieder in einem leicht zugänglichen Wörterbuch. Die Meta-Klassen von Django-Modellen nehmen beispielsweise Strings zu Referenzmitgliedern auf.
Ich könnte C # / Java in Python schreiben, aber ich will es wirklich nicht. Ich glaube immer noch fest an "keine Reflexion" für diese Sprachen. Ist der Python-Weg einfach grundverschieden?
Als dynamische Sprache unterscheidet sich Python grundlegend von statisch getippten Sprachen, daher ist alles eine Spiegelung darin :-) Auch verwende niemals die Reflektion im Produktionscode (für statische Sprachen) scheint mir etwas extrem zu sein .
Ich denke, dass die "no reflection in production code" in c # nicht korrekt ist.
Die Reflexion ermöglicht dem Programmierer oft Dinge, die sonst unmöglich sind
Ich würde sagen: "Keine Reflexion für nichtöffentliche Mitglieder im Produktionscode" und "Reflexion mit Vorsicht nutzen!" Wenn Sie nicht richtig verwendet werden, können Sie die Leistung verlieren. Bei richtiger Verwendung können Sie Leistung gewinnen (denken Sie nur an statische Reflexion)
Verwenden Sie keine Reflektion für massiv aufgerufenen Code.
Python ist stattdessen eine dynamische Sprache. Alle Konzepte sind unterschiedlich. Die Normalität (und der richtige Weg dazu) ist die Verwendung der Techniken, über die du sprichst.
Ja, in diesem Aspekt ist Python-Entwicklung grundlegend anders.
Reflection in C # / Java bezieht sich auf die Fähigkeit der Laufzeitumgebung, Informationen über den ausgeführten Code zu erhalten und basierend auf diesen Informationen Entscheidungen zu treffen.
Da Python die dynamische Typisierung verwendet, wird jede Typentdeckung an die Laufzeit und nicht an die Kompilierzeit delegiert. Das bedeutet also, dass jedes Python-Programm Reflektion verwenden muss, um zu funktionieren, nur nicht Reflektieren genannt, heißt es das Programm laufen zu lassen.
Darüber hinaus umfasst die Python-Philosophie die dynamische Art der Ausführung, also sollten Sie nicht zögern, sie zu Ihrem Vorteil zu nutzen.
P.S. Obwohl man Reflexionen in engen Schleifen vermeiden sollte und man sich bewusst sein sollte, dass die Reflexion um ein oder zwei Größenordnungen langsamer ist, sollte man keine Angst haben, es zu verwenden, wenn es das richtige Werkzeug für den Job ist.
Reflection ist eine sehr fortschrittliche und leistungsstarke Technologie. Aber es ist langsam. Sie können Reflexion verwenden, aber nicht zu oft. Daher haben CLR-Entwickler einen weiteren coolen Typ zu .NET 4.0 hinzugefügt - dynamic type . Ich empfehle Ihnen dringend, auf einige Dokumente oder Bücher für weitere Informationen verweisen. F. e. CLR über C #.
%Vor%CLR über C #:
Es gibt auch viele Gelegenheiten, wenn a Programm muss auf Informationen reagieren, die es weiß nicht, bis es ist Laufen. Während Sie Typ-Safe verwenden können Programmiersprachen (wie C #) zu interagieren mit dieser Information, die Die Syntax ist besonders schwerfällig da du viel mit arbeitest Saiten und Leistung wird behindert auch. Wenn Sie ein reines C # schreiben Anwendung, dann die einzige Gelegenheit Sie haben mit zu arbeiten Laufzeitbestimmte Information ist wann Sie verwenden Reflexion (diskutiert in Kapitel 23). Allerdings viele Entwickler Verwenden Sie auch C #, um mit zu kommunizieren Komponenten, die nicht implementiert sind C #. Einige dieser Komponenten könnten sein .NET-dynamische Sprachen wie Python oder Ruby oder COM-Objekte, die dies unterstützen die IDispatch-Schnittstelle (möglicherweise in nativem C oder C ++ implementiert), oder HTML-Dokumentobjektmodell (DOM) Objekte (implementiert mit verschiedenen Sprachen und Technologien). Die Kommunikation mit HTML-DOM-Objekten ist besonders nützlich beim Aufbau eines Microsoft Silverlight-Anwendung. Zu Machen Sie es für Entwickler einfacher Reflexion oder Kommunikation mit anderen Komponenten bietet Ihnen der C # -Compiler eine Möglichkeit, den Typ eines Ausdrucks als zu markieren dynamisch. Sie können das Ergebnis auch setzen eines Ausdrucks in eine Variable und Sie können den Typ einer Variablen als markieren dynamisch. Diese Dynamik Ausdruck / Variable kann dann verwendet werden um ein Element wie ein Feld aufzurufen, a Eigenschaft / Indexer, eine Methode, Delegat, und unäre / binäre / Konvertierungsoperatoren. Wenn Ihr Code ein Mitglied mit verwendet ein dynamischer Ausdruck / eine Variable, der Compiler erzeugt speziellen IL-Code das beschreibt die gewünschte Operation. Dieser spezielle Code wird als bezeichnet die Nutzlast. Zur Laufzeit die Payload code bestimmt die genaue Operation nach Ausführen basierend auf dem tatsächlichen Typ von das Objekt, auf das jetzt verwiesen wird dynamischer Ausdruck / Variable.
Tags und Links python java c# reflection