2009-09-17 20 views
7

Scrivo molti script in Python per analizzare e tracciare dati sperimentali e scrivere semplici simulazioni per verificare come le teorie si adattano ai dati. Gli script tendono ad essere molto procedurali; calcola qualche proprietà, calcola qualche altra proprietà, valuta le proprietà, analizza la trama ...Utilizzo classe in Python

Piuttosto che limitarsi a scrivere una procedura, ci sarebbero dei vantaggi nell'usare una Classe? Posso seppellire l'analisi attuale in funzioni in modo da poter passare i dati alla funzione e lasciare che faccia la cosa ma le funzioni non sono contenute in una classe.

Che tipo di inconvenienti sarebbe una classe finita e quale sarebbe lo scopo di utilizzare una classe se può essere scritta proceduralmente?

Se questo è stato pubblicato prima delle mie scuse, indicamelo in quella direzione.

risposta

15

Utilizzando la programmazione orientata agli oggetti, si avranno oggetti, che hanno funzioni associate, che sono (dovrebbero) essere l'unico modo per modificare le sue proprietà (variabili interne).

Era comune avere funzioni chiamate trim_string(string), mentre con una classe string è possibile eseguire string.trim(). La differenza è evidente soprattutto quando si eseguono grandi moduli complessi, in cui è necessario fare tutto il possibile per minimizzare l'accoppiamento tra i singoli componenti.

Ci sono altri concetti che comprendono OOP, come l'ereditarietà, ma la vera cosa importante da sapere, è che OOP è di fare si pensa a oggetti che hanno operazioni e un messaggio di passaggio (metodi/verbi), invece di pensare in termini di operazioni (funzioni/verbi) e gli elementi di base (variabili)

The importance dell'oggetto orientato paradigma non è tanto nel meccanismo lingua è nel processo di pensiero e progettazione.

Anche dare un'occhiata a this question.

Non c'è niente di intrinsecamente sbagliato su Programming strutturata, è solo che alcuni problemi mappa di meglio da un design Object Oriented.

Per esempio si potrebbe avere in un linguaggio SP:

#Pseudocode!!! 

function talk(dog): 
    if dog is aDog: 
     print "bark!" 
    raise "IS NOT A SUPPORTED ANIMAL!!!" 

>>var dog as aDog 
>>talk(dog) 
"bark!" 
>>var cat as aCat 
>>talk(cat) 
EXCEPTION: IS NOT A SUPPORTED ANIMAL!!! 

# Lets add the cat 
function talk(animal): 
    if animal is aDog: 
     print "bark!" 
    if animal is aCat: 
     print "miau!" 
    raise "IS NOT A SUPPORTED ANIMAL!!!" 

Durante una programmazione orientata agli oggetti che avrebbe dovuto:

class Animal: 
    def __init__(self, name="skippy"): 
     self.name = name 
    def talk(self): 
     raise "MUTE ANIMAL" 

class Dog(Animal): 
    def talk(self): 
     print "bark!" 

class Cat(Animal): 
    def talk(self): 
     print "miau!" 

>>dog = new Dog() 
>>dog.talk() 
"bark!" 
>>cat = new Cat() 
>>cat.talk() 
"miau!" 

si può vedere che con SP, ogni animale che si aggiunge , dovresti aggiungere un altro if a talk, aggiungere un'altra variabile per memorizzare il nome dell'animale, toccare potenzialmente ogni funzione nel modulo, mentre su OOP, puoi considerare la tua classe come indipendente dal resto. Quando c'è un cambiamento globale, cambi il Animal, quando si tratta di una modifica ristretta, devi solo guardare la definizione della classe.

Per codice semplice, sequenziale e possibilmente usa e getta, è possibile utilizzare la programmazione strutturata.

+7

quelle sono alcune eccezioni molto arrabbiato –

+1

L'utente deve essere punito per fare qualcosa di sbagliato. L'interfaccia dovrebbe * ferire * l'utente. E la sicurezza è ** più importante ** dell'usabilità. In un mondo perfetto, nessuno sarebbe in grado di usare qualsiasi cosa. http://www.usalyze.com/wp-content/dilbert-200209233.gif http://www.usernomics.com/images/dilbert.gif (non ha trovato tutti i riferimenti) – voyager

+0

@voyager che ho mai visto la sintassi 'var = new Class()', almeno non in Python. Vorrei usare 'var = Class()'. Mi sto perdendo qualcosa? –

4

Non è necessario utilizzare per utilizzare le classi in Python: non obbliga a eseguire OOP.Se ti senti più a tuo agio con lo stile funzionale, va bene. Uso le classi quando voglio modellare un'astrazione che ha delle variazioni e voglio modellare quelle variazioni usando le classi. Come suggerisce la parola "classe", sono utili soprattutto quando le cose con cui stai lavorando rientrano naturalmente in varie classi. Quando si manipolano solo dataset di grandi dimensioni, non ho trovato una necessità assoluta di seguire un paradigma OOP solo per il gusto di farlo.

1

"ma le funzioni non sono contenute in una classe."

Potrebbero essere.

class Linear(object): 
    a= 2. 
    b= 3. 
    def calculate(self, somePoint): 
     somePoint['line']= b + somePoint['x']*a 

class Exponential(object): 
    a = 1.05 
    b = 3.2 
    def calculate(self, somePoint): 
     somePoint['exp']= b * somePoint['x']**a 

class Mapping(object): 
    def __init__(self): 
     self.funcs = (Linear(), Exponential()) 
    def apply(self, someData): 
     for row in someData: 
      for f in self.funcs: 
       f.calculate(row) 

Ora i calcoli sono inclusi in classi. È possibile utilizzare modelli di progettazione come Delegazione, Composizione e Comando per semplificare gli script.

+1

Questo è grave :-) –

+0

Forse. Ma si estende facilmente per creare funzioni di analisi composibili che è possibile configurare in modo abbastanza semplice per fare una vasta gamma di operazioni comuni di slice/dice/analisi/riepilogo. –

1

OOP si presta bene a programmi complessi. È fantastico per catturare lo stato e il comportamento dei concetti del mondo reale e orchestrare l'interazione tra loro. Un buon codice OO è di facile lettura/comprensione, protegge l'integrità dei dati e ottimizza il riutilizzo del codice. Direi che il riutilizzo del codice è un grande vantaggio per mantenere i calcoli usati frequentemente in una classe.

1
  • La programmazione orientata agli oggetti non è la soluzione a tutti i problemi di codifica.

  • In Python, le funzioni sono oggetti. Puoi mischiare tutti gli oggetti e le funzioni che vuoi.

  • I moduli con funzioni sono già oggetti con proprietà.

  • Se vi trovate a passare molte delle stesse variabili in giro - state - un oggetto è probabilmente più adatto. Se hai molte classi con metodi di classe, o metodi che non usano molto il self, allora le funzioni sono probabilmente migliori.