Diciamo che ho class
, che utilizza alcune funzionalità di dict
. Ho usato per comporre un oggetto dict
all'interno e fornire un accesso dall'esterno, ma recentemente ho pensato di ereditare semplicemente dict
e aggiungere alcuni attributi e metodi che potrei richiedere. È un buon modo per andare o dovrei attenermi alla composizione?python: ereditario o composizione
risposta
L'ereditarietà è molto spesso abusata. A meno che la tua classe non sia destinata ad essere usata come dizionario generico con funzionalità extra, direi che la composizione è la strada da percorrere.
Salvare le chiamate di inoltro di solito non è un motivo sufficiente per scegliere l'ereditarietà.
Dal libro Design Pattern:
favore composizione di oggetti nel corso di ereditarietà di classe
Idealmente non dovrebbe avere per creare nuovi componenti per raggiungere il riutilizzo. È necessario che sia in grado di ottenere tutte le funzionalità di necessarie assemblando i componenti esistenti tramite la composizione dell'oggetto . Ma raramente è il caso , perché il set di componenti disponibili non è mai abbastanza abbastanza nella pratica. Il riutilizzo per eredità semplifica la creazione di nuovi componenti che possono essere composti con quelli vecchi. La successione e la composizione dell'oggetto funzionano quindi insieme.
Tuttavia, la nostra esperienza è che i progettisti eredità un uso eccessivo come tecnica di riutilizzo e disegni sono spesso reso più riutilizzabili (e più semplice) da seconda più composizione di oggetti."
L'intero testo è qui: http://blog.platinumsolutions.com/node/129
Entrambi sono buoni, ma preferirei ereditare, poiché significherebbe meno codice (che è sempre buono fintanto che è leggibile).
Dive into Python has a very relevant example.
Su Python 2.2 e versioni precedenti, non è stato possibile creare sottoclassi da ins integrati direttamente, pertanto ha avuto per utilizzare la composizione.
class FileInfo(dict): "store file metadata" def __init__(self, filename=None): self["name"] = filename
- La prima differenza è che non c'è bisogno di importare il modulo UserDict, dal momento che dict è un built-in tipo di dati ed è sempre disponibile. Il secondo è che si eredita direttamente da dict, invece che da UserDict.UserDict.
- La terza differenza è sottile ma importante. A causa del modo in cui UserDict funziona internamente, è necessario chiamare manualmente il suo metodo
__init__
per inizializzare correttamente le sue strutture dati interne.dict
non funziona così; non è un wrapper e non richiede l'inizializzazione esplicita.
È veramente a pesare il costo e la portata di ciò che si sta cercando di fare Ereditando da dict
perché si vuole un comportamento simile ai dizionari è veloce. e facile, ma soggetto a limitazioni come la creazione di oggetti creati dalla classe per essere inascoltabili
Quindi, ad esempio, se si desidera serializzare (ovvero pickle
) gli oggetti, ma anche il comportamento di tipo dizionario, quindi ovviamente non puoi ereditare direttamente da dict
e avrai bisogno di comporre le parti della funzionalità che desideri per farlo accadere.
Se isinstance(my_object, dict)
restituisce Vero o Falso? In altre parole, se accidentalmente assegnate uno degli oggetti a qualcosa che desidera un dict
, dovrebbe cercare di utilizzarlo allegramente come dict
? Probabilmente no, quindi usa la composizione.
Aiutare la gente a digitare tipografia non è necessariamente una buona cosa. –
Il controllo del tipo ha la sua posizione. Ad esempio, se avessi una bella funzione di stampa che comprendeva dict, probabilmente non vorresti che stampasse il tuo oggetto avanzato come se fosse un ditt. Né vorresti usare l'alternativa di tipo check-free: monkey patching dict. –
- 1. Selettore ereditario
- 2. Migliore funzione composizione in Python
- 3. Comportamento ereditario ExtJs
- 4. Astratto con ereditario come campo
- 5. Problema ereditario virtuale privato C++
- 6. Elemento ereditario membro statico in C#
- 7. Docker-composizione e PDB
- 8. Composizione regexp?
- 9. Composizione funzione
- 10. Dovrei utilizzare l'ereditarietà o la composizione in questo caso?
- 11. reagire redux: composizione contenitori
- 12. Ottimizzazione html/modello Composizione
- 13. Funzione di composizione variabile?
- 14. OpenERP visualizza sempre vista ereditario, invece di originali
- 15. Piping, composizione e curring
- 16. Composizione tratti indipendenti
- 17. Composizione di interfacce [Golang]
- 18. Scalaz Lens Composizione
- 19. F #: composizione del motivo?
- 20. funzione Haskell composizione domanda
- 21. Nascondi durante la composizione
- 22. scala tipo tupla composizione
- 23. Funzione di composizione con Enumeratore
- 24. generica composizione funzione in Haskell
- 25. funzione di composizione e modulo funzionale
- 26. PySpark row-wise funzione composizione
- 27. L'installazione pod Cocoapods fornisce un metodo non definito ereditario
- 28. Composizione di funzioni in Java?
- 29. Funzione Composizione Funzione VS Applicazione
- 30. Composizione Monadi v Funtori applicativi
Ricorda che Python è estremamente flessibile, la composizione degli oggetti è ottima, ma se stai solo mappando uno a uno su un altro oggetto, l'ereditarietà è la strada da percorrere. – voyager
Non penso che abbia nulla a che fare con la flessibilità di Python, è un problema di design. Se stai mappando tutti i metodi di un oggetto all'altro, probabilmente stai costruendo un dizionario: usa l'ereditarietà. Ma quando il poster originale scrive "I have class, that utilizza alcune funzionalità di dict", allude al fatto che la classe non è pensata per essere usata come un dizionario. –
Il link a platinumsolutions non funziona più ... potresti modificare ... – unclejamil