Gibt es so etwas wie das Python-Deskriptor-Protokoll in anderen Sprachen? Es scheint eine nette Möglichkeit zu sein, die Modularität / Kapselung zu erhöhen, ohne die Implementierung der enthaltenden Klasse aufzublähen, aber in anderen Sprachen habe ich noch nie etwas Ähnliches gehört. Ist es in anderen Sprachen wegen des Nachschlage-Overheads wahrscheinlich nicht vorhanden?
Ich habe auch nichts von einem direkten Gegenstück gehört. Sie könnten wahrscheinlich den gleichen Effekt mit Makros erreichen, besonders in einer Sprache wie Lisp, die extrem mächtige Makros hat.
Ich wäre überhaupt nicht überrascht, wenn andere Sprachen etwas Ähnliches einbeziehen, weil es so mächtig ist.
Mit Ruby und C # können Sie ganz einfach Accessoren erstellen, indem Sie Getter / Setter-Methoden für ein Attribut angeben, ähnlich wie in Python. Es ist jedoch nicht so konzipiert, dass Sie den Code für diese Methoden in einer anderen Klasse so schreiben können, wie es Python zulässt. In der Praxis bin ich nicht sicher, wie wichtig das ist, denn jedes Mal, wenn ich ein Attribut gesehen habe, das durch das Deskriptorprotokoll definiert wurde, wurde es in derselben Klasse implementiert.
EDIT: Verdammt meine Legasthenie (womit ich unvorsichtiges Lesen meine). Aus irgendeinem Grund habe ich immer "Deskriptor" als "Dekorateur" gelesen und umgekehrt, auch wenn ich derjenige bin, der beide schreibt. Ich werde meinen Beitrag intakt lassen, da er gültige Informationen enthält, obwohl Informationen, die absolut nichts mit der Frage zu tun haben.
Der Begriff "Dekorateur" selbst ist eigentlich der Name eines Designmusters, das im berühmten Buch "Design Patterns" beschrieben wird. Der Wikipedia-Artikel enthält viele Beispiele in verschiedenen Programmiersprachen der Decorator-Verwendung: Ссылка
Die Dekoratoren in diesem Artikel sind jedoch objektorientiert; Sie haben Klassen, die eine vordefinierte Schnittstelle implementieren, die eine andere existierende Klasse irgendwie anders verhalten lässt usw. Python-Dekoratoren funktionieren funktional, indem sie eine Funktion zur Laufzeit durch eine andere Funktion ersetzen, so dass Sie diese Funktion effektiv ändern / ersetzen, Code einfügen usw.
Dies ist in der Java-Welt als aspektorientierte Programmierung bekannt, und der AspectJ Java-Compiler ermöglicht Ihnen diese Art von Dingen und kompiliert Ihren AspectJ-Code (der eine Obermenge von Java ist) in Java-Bytecode.
Ich bin nicht genug vertraut mit C # oder Ruby, um zu wissen, was ihre Version von Decorators wäre.
Tags und Links python language-features encapsulation