Ich habe versucht, mein Gehirn um Dekoratoren in Python wickeln, aber kann nicht verstehen, warum wir das gleiche durch die Verwendung von Unterklassen nicht erreichen können?Was ist der Unterschied zwischen der Verwendung von Dekoratoren und der Erweiterung einer Unterklasse durch Vererbung?
Antwort
Sie können das Gleiche mit Unterklassen erreichen, und tatsächlich brauchen Sie nicht einmal Unterklassen - Sie können das Gleiche auch einfach erreichen, indem Sie eine Methode in eine andere Methode einfügen und neu zuweisen. Es gab eine Menge Diskussionen darüber, ob die Dekoratorsyntax der Sprache hinzugefügt werden sollte oder nicht, da es Ihnen nicht erlaubt, etwas Neues zu tun, und Programmierer neue Dinge lernen müssen.
Was die Syntax Dooes formalisiert ein Muster, das viele Leute bereits verwendet haben, und machen es zu einer Standardsyntax, die einen Namen und Richtlinien zur Verwendung hat. Es ist nicht notwendig, dass Sie Dekoratoren verwenden - Sie können den gleichen Effekt auf andere Weise erzielen - aber die Verwendung des offiziell unterstützten Standardansatzes mit einer prägnanten, leicht zu lesenden Syntax erleichtert das Leben ein wenig.
Ich hoffe, dass OP weiß, dass @ @spam \ nclass Ham {...} '==' class Ham {...}; Ham = spam (Ham) 'und fragen Sie einfach, warum Sie dieses Muster verwenden, anstatt Unterklassen zu verwenden. – delnan
Sie wissen, dass das Voranstellen eine Definition mit
@spam class|def name
bedeutet nur „Namen definieren, wie hier geschrieben, dannname
-spam(name)
binden“?Dekoratoren werden sehr oft auf Funktionen und nicht auf Klassen angewendet. Sicher, Sie könnten eine aufrufbare Klasse und Unterklasse erstellen, die ... Sie könnten auch Ihren eigenen Integer-Typ implementieren. Keine ist lebensfähig.
In ganz wenigen Fällen Sie, propably etwas sehr ähnliches tun könnte durch Subklassen ... außer, dass Dekorateure einmal definiert werden und kann auf mehrere Klassen angewendet werden, im Gegensatz zu einer neuen Unterklasse selbst in jedem Fall schriftlich . Jede Lösung würde zwangsläufig den Dekorateuren gleichkommen oder sehr ähnlich sein.
als Robert in einem Kommentar weist darauf hin, wenn Sie ein Beispiel haben die Antworten präziser sein könnten ...
- 1. Was ist der Unterschied zwischen Mixins und Vererbung?
- 2. Was ist der Unterschied zwischen der Verwendung externer und # Headerdateien?
- 3. Was ist in CSS der Unterschied zwischen Kaskadierung und Vererbung?
- 4. Was ist der Unterschied zwischen `==` und `ist`?
- 5. Was ist der Unterschied zwischen:
- 6. Was ist der Unterschied zwischen Firefox-Erweiterung und Plugin?
- 7. Was ist der Unterschied zwischen der Rückgabe von bind und dem Ergebnis der Verwendung von function()
- 8. Was ist der Unterschied zwischen $ und $$?
- 9. Was ist der Unterschied zwischen einer "nonce" und einer "GUID"?
- 10. Was ist der Unterschied zwischen @ViewChild und @ContentChild?
- 11. Was ist der Unterschied zwischen der Verwendung von cfinvoke und createObject zum Ausführen einer Komponentenfunktion?
- 12. Was ist der Unterschied zwischen Speicherzuweisung durch neue und Zuweiser
- 13. Was ist der Unterschied zwischen/* ... */und/** ... */
- 14. Was ist der Unterschied zwischen Verwendung und extern?
- 15. Was ist der Unterschied zwischen Difftime und '-'?
- 16. Was ist der Unterschied zwischen Verilog! und ~?
- 17. Was ist der Unterschied zwischen `&` und `ref`?
- 18. Was ist der Unterschied zwischen der Verwendung von "" und "" und() beim Deklarieren von Variablen?
- 19. Was ist der Unterschied zwischen der JSP und der JSTL?
- 20. Was ist der Unterschied zwischen der Verwendung und der Nichtverwendung von Anweisungen mit DbContext [Code zuerst]?
- 21. Was ist der Unterschied zwischen:.! und: r !?
- 22. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 23. Was ist der Unterschied zwischen $ (...) und `...`
- 24. Was ist der Unterschied zwischen .Equals und ==
- 25. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 26. Was ist der Unterschied zwischen + = und = +?
- 27. Was ist der Unterschied zwischen? und ? = Nil
- 28. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 29. Was ist der Unterschied zwischen einer Portnummer und einer Protokollnummer?
- 30. Was ist der Unterschied zwischen einer Subroutine und einer Funktion?
Haben Sie ein Beispiel im Sinne? – robert