2010-08-16 26 views
11

Mi viene un po 'di mal di testa cercando di capire come organizzare moduli e classi insieme. Venendo da C++, sono abituato a classi che incapsulano tutti i dati e i metodi necessari per elaborare quei dati. In Python ci sono comunque dei moduli e dal codice che ho visto, alcune persone hanno un sacco di funzioni libere memorizzate nei moduli, mentre altre quasi sempre associano le loro funzioni alle classi come metodi.organizzazione di classi e moduli in python

Ad esempio, diciamo che ho una struttura dati e vorrei scriverlo su disco.

Un modo potrebbe essere quello di implementare un metodo save per l'oggetto in modo che potessi basta digitare

MyObject.save(filename) 

o qualcosa di simile. Un altro metodo che ho visto in uguale proporzione è di avere qualcosa di simile

from myutils import readwrite 

readwrite.save(MyObject,filename) 

Questo è un piccolo esempio, e io non sono sicuro di come pitone specifica questo problema è affatto, ma la mia domanda generale è quello che è il migliore pratica pitonica in termini di organizzazione di funzioni vs metodi?

risposta

13

Sembra che le funzioni allentate diano fastidio. Questo è il modo Python. Ha senso perché un modulo in Python è in realtà solo un oggetto sullo stesso piano di qualsiasi altro oggetto. Ha un supporto a livello di lingua per caricarlo da un file, ma a parte questo, è solo un oggetto.

così se ho un modulo di foo.py:

import pprint 

def show(obj): 
    pprint(obj) 

Poi il quando ho importarlo da bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

sto essenzialmente l'accesso a un metodo sull'oggetto foo. Gli attributi dei dati del modulo foo sono solo i globali definiti in foo. Un modulo è l'implementazione a livello di linguaggio di un singleton senza la necessità di anteporre lo self a ogni elenco di argomenti dei metodi.

Provo a scrivere quante più funzioni a livello di modulo possibile. Se alcune funzioni funzioneranno solo con un'istanza di una particolare classe, la renderò un metodo sulla classe. Altrimenti, cerco di farlo funzionare su istanze di ogni classe che è definita nel modulo per cui avrebbe senso.

Il razionale dietro l'esempio esatto che ti ha dato è che se ogni classe ha un metodo di salvataggio, poi se in seguito si modifica come si sta salvando i dati (dal file system per esempio a base di dati o un file XML remoto) poi si deve cambiare ogni classe. Se ogni classe implementa un'interfaccia per fornire i dati che desidera vengano salvati, è possibile scrivere una funzione per salvare istanze di ogni classe e modificare la funzione solo una volta. Questo è noto come Principio di Responsabilità Unica: ogni classe dovrebbe avere solo una ragione per cambiare.

3

Se si dispone di una vecchia classe normale che si desidera salvare su disco, farei semplicemente un metodo di istanza. Se fosse una libreria di serializzazione in grado di gestire diversi tipi di oggetti, farei la seconda strada.

+2

Il termine "metodo di classe" suona come un 'classmethod', che non è applicabile. La cosa appropriata sarebbe chiamata "metodo" o "metodo di istanza". –

+0

Sì, hai ragione. Intendo un metodo di istanza. –

Problemi correlati