Quali sono le principali differenze tra metaclassi Python e decoratori di classe? C'è qualcosa che posso fare con uno ma non con l'altro?metaclassi Python vs decoratori di classe
risposta
I decoratori sono molto, molto più semplici e più limitati - e quindi dovrebbero essere preferiti ogni volta che l'effetto desiderato può essere raggiunto con un metaclasse o un decoratore di classe.
Qualsiasi cosa tu possa fare con un decoratore di classe, puoi ovviamente fare con un metaclass personalizzato (basta applicare la funzionalità della "funzione decoratore", cioè quella che prende un oggetto di classe e lo modifica, nel corso del metacarattere __new__
o __init__
che rendono l'oggetto classe! -).
Ci sono molte cose che puoi fare in un metaclasse personalizzato ma non in un decoratore (a meno che il decoratore non generi e applichi internamente un metaclasse personalizzato, ovviamente - ma questo è imbroglio; -) ... e anche allora, in Python 3, ci sono cose che puoi fare solo con un metaclasse personalizzato, non dopo il fatto ... ma questa è una sub-nicchia abbastanza avanzata della tua domanda, quindi lasciatemi dare esempi più semplici).
Per esempio, supponiamo di voler fare un oggetto di classe X
tale che print X
(o in Python 3 print(X)
ovviamente ;-) mostra peekaboo!
. Non è possibile farlo senza un metaclasse personalizzato, perché l'override di metrame di __str__
è l'attore cruciale qui, cioè, è necessario un def __str__(cls): return "peekaboo!"
nel metaclass personalizzato della classe X
.
Lo stesso vale per tutti i metodi magici, cioè, a tutti i tipi di operazioni applicati all'oggetto classe stessa (a differenza, quelli applicato al suo istanze, che utilizzano metodi magici come definito nella classe - le operazioni sull'oggetto classe stesso usano metodi magici come definito nel metaclass).
- 1. Python metaclassi
- 2. Python Decoratori - __call__ in classe
- 3. Decoratori di classe in ES7
- 4. __decorated__ per decoratori Python
- 5. Decoratori ed ereditarietà Python
- 6. decoratori Python nelle classi
- 7. Python: uso di decoratori v/s mixin?
- 8. Decoratori applicati alla definizione della classe con Python
- 9. Consueto di ereditare metaclassi da tipo?
- 10. Unità test decoratori in Python
- 11. Decoratori C++ simili a Python
- 12. Decoratori in stile Python in Java?
- 13. Utilizzo di decoratori su lambda in Python?
- 14. Convenzioni di denominazione Python nei decoratori
- 15. Come testare i decoratori di funzioni Python?
- 16. Buoni usi reali delle metaclassi (ad es. In Python)
- 17. Decoratori Python ed ereditarietà delle classi
- 18. Python: terminologia 'classe' VS 'tipo'
- 19. Membri di classe - Java vs Python
- 20. Variabile di classe Python int vs array
- 21. I decoratori Python sui membri della classe falliscono quando il meccanismo decoratore è una classe
- 22. Decoratori di classe, ereditarietà, super() e massima ricorsione
- 23. Decoratori e classi nello sviluppo web Python
- 24. Decoratori su metodi astratti
- 25. Vecchio stile, classi di nuovo stile e metaclassi
- 26. decoratori di funzioni in C#
- 27. Come i decoratori lavorano con le classi in python
- 28. Decoratori di funzioni annidate che operano su argomenti in python
- 29. decoratori e metodi di pitone
- 30. decoratori funzione con parametri su una vista basata classe Django
risposta interessante da connazionale eminente =) – gpilotino
Ciao gino, sempre particolarmente contento di aiutare un connazionale ovviamente ;-). –
Beh .. sono passati 4 anni e ho trovato questa domanda su google. Voglio solo prendere nota del tuo esempio. Ho definito un decoratore 'foo (cls)' che ha 2 istruzioni: 'cls .__ str__ = lambda self:" peekaboo! "' E subito dopo 'return cls', e in effetti ha funzionato - Ho impostato il' metodo __str__' di qualche classe con il decoratore piuttosto che con un metaclasse complicato .. Volevo solo prenderlo in considerazione, e magari ottenere qualche commento per sapere se mi manca qualcosa. – rboy