2010-01-19 14 views
29

Sono abbastanza nuovo per Python in generale.Devo creare ogni classe nel proprio file .py?

Sono consapevole che posso creare più classi nello stesso file .py, ma mi chiedo se dovrei creare ogni classe nel proprio file .py.

In C#, ad esempio, avrei una classe che gestisce tutte le interazioni del database. Poi un'altra classe che aveva le regole del business.

È questo il caso in Python?

risposta

25

No. Lo stile tipico di Python consiste nel mettere le classi correlate nello stesso modulo. Può essere che una classe finisca in un modulo a sé stante (specialmente se è una classe di grandi dimensioni), ma non dovrebbe essere un obiettivo a sé stante. E quando lo fai, per favore non nominare il modulo dopo la lezione - finirai per confondere te stesso e gli altri su quale sia il problema.

+4

Provenendo da Java Ho avuto questa stessa domanda, ragazzo ero confuso per un po '. :-) – snarkyname77

+0

È interessante notare che PyDev ti offre la possibilità di fare proprio questo. – Uri

+0

Se si importa una classe da un file con più classi, l'interprete non eseguirà tutte le classi in quel file? –

8

Ogni file .py rappresenta un modulo, quindi è necessario mantenere gruppi logici di funzioni, costanti e classi nello stesso file.

Ogni classe in un file .py sarà solo creare ingrossi epico nella tabella del modulo, dal momento che, se siete interessati solo a una classe ancora

from whatever import SomeClass 
+7

Lo stile Python di solito usa "minuscolo" per i nomi dei moduli e "CapWords" per i nomi delle classi: http://www.python.org/dev/peps/pep-0008/ –

+0

Hai perfettamente ragione Greg, modifico. – richo

+0

A volte gli stili sono stupidi. Se hai una classe Foo, vai avanti e mettila nel modulo Foo.py. Perché dovresti metterlo in foo.py minuscolo? Quindi puoi scrivere 'da foo import Foo'? Scrivendo '__all__ = ['Foo']' nel modulo, puoi quindi digitare 'da foo import *' o 'da Foo import *' e non ci sarà confusione. I nomi dei moduli in lettere minuscole sono stupidi se contengono solo una classe. –

1

Probabilmente non si può. I file Python sono "moduli". I moduli dovrebbero contenere solo quale codice è riutilizzabile in modo indipendente. Se questo comprende diverse classi, che è la norma, allora è perfettamente ok.

3

Un altro punto degno di nota è che se un file diventa troppo grande, è sempre possibile trasformarlo in un pacchetto, semplificando la riorganizzazione senza rompere il codice del client.

+0

Un pacchetto è semplicemente più file (più moduli). Quindi la tua risposta sta fondamentalmente dicendo che sì, ogni classe dovrebbe andare nel proprio file (modulo) quando la quantità di codice diventa troppo grande. –

2

Non sono d'accordo con gli altri e dico di sì. Per me, ho avuto un successo migliore mettendo ogni classe in un proprio file (modulo). Ma ci sono delle eccezioni quindi lasciatemi spiegare un esempio.

Se si dispone di una classe Foo, poi metterlo in un file chiamato Foo.py, con le seguenti sezioni:

  1. Importazioni
    • Questo è dove si tira in dipendenze.
    • Esempi: import math, from Bar import *
  2. Globali
    • Questo è dove si definisce l'interfaccia esterna al modulo, che sono tutti i simboli che si trovano al di fuori visibile di questo modulo.
    • Esempio: __all__ = ['Foo']
    • Questo è anche il punto in cui è possibile definire variabili globali (non valide) e costanti globali (buone). Questi globali non devono essere esportati; possono essere resi globali solo per semplificare il codice.
    • Esempio: PI = 3.14159 significa che è possibile scrivere PI, mentre se lo si è definito all'interno della classe Foo, è necessario scrivere Foo.PI.
  3. Funzioni
    • Questo è dove si definiscono tutte le funzioni di primo livello che sono rilevanti per classe Foo, ma non appartieni alla classe Foo spazio dei nomi. Questi sono probabilmente rari in quanto le classi consentono sia il @staticmethods che le classi interne.
    • Esempio: def print_foo(foo): print(foo)
  4. Classi
    • Esempio: class Foo(object): pass

A volte si vuole mettere più di una classe nello stesso modulo. Dovresti farlo quando due o più classi sono concettualmente correlate al punto in cui le utilizzerai quasi sempre insieme e mai in modo indipendente. Questa è l'eccezione, non la norma. In questo caso, aggiungi tutti i nomi di classe allo __all__ globale.

Infine, per ogni modulo Foo.py, dovrebbe esserci un modulo di test dell'unità corrispondente denominato testFoo.py.

1

Sì ogni classe nel proprio file. L'importazione anche di una singola classe (o funzione) in un file con più classi fa sì che python esegua la definizione di tutte le classi nel file. Prova questo:

manyClass.py

class foo(): 
    print 'a bunch of time consuming work' 

class tryme(): 
    print 'try me' 

Ora digitate questo nella shell interprete ...

da manyClasses importare tryme

un po 'di tempo di lavoro
Try Me

Problemi correlati