Utilizzo di vars o attributi "pubblici" nelle chiamate di classe, approccio funzionale

1

Mi sono sempre chiesto due cose che tendo a fare nei miei piccoli progetti. A volte avrò questo design:

class FooClass
    ...
    self.foo = "it's a bar"
    self._do_some_stuff(self)

    def _do_some_stuff(self):
        print(self.foo)

E a volte questo:

class FooClass2
    ...
    self.do_some_stuff(foo="it's a bar")

    def do_some_stuff(self, foo):
        print(foo) 

Anche se capisco approssimativamente le differenze tra approcci funzionali e di classe, ho difficoltà con il design.

Ad esempio, in FooClass la self.foo è sempre accessibile come attributo. Se ci sono numerose chiamate ad esso, è più veloce di fare foo una variabile locale che viene passata dal metodo al metodo (come in FooClass2 )? Cosa succede in memoria in entrambi i casi?

Se si preferisce FooClass2 (cioè non ho bisogno di accedere a foo ) e gli altri attributi all'interno non cambiano i loro stati (la classe viene eseguita una sola volta e restituisce il risultato), se il codice allora è scritto come una serie di funzioni in un modulo?

    
posta marw 24.06.2011 - 23:33
fonte

1 risposta

1

Entrambi gli approcci saranno approssimativamente equivalenti in termini di velocità, a seconda dell'ottimizzazione, dell'architettura, della memoria precedentemente memorizzata nella cache, ecc. Non mi preoccuperei della velocità a meno che il profiling non lo ritenga critico.

Il principio di progettazione in gioco qui è che vuoi che le variabili restino intatte finché sono necessarie, e non più . Questo evita problemi come pensare che foo contenga già il valore che vuoi, ma in realtà sono vecchi dati che semplicemente passano i tuoi test, ma falliscono miseramente nella produzione. Ciò significa che il secondo approccio è generalmente preferibile a meno che tu non abbia una buona ragione per mantenere foo in giro per più di una chiamata di funzione e se l'oggetto corrente è il posto più logico per mantenerlo.

    
risposta data 25.06.2011 - 00:10
fonte

Leggi altre domande sui tag