2011-01-27 10 views
5

Recentemente ho iniziato ad usare Python 2.6 per admin Ubuntu Server e hanno due questioni minori in materia di ridondanza:evitare la ridondanza in Python

Prima cosa sono le importazioni: Sembrano tutti qualcosa di simile Classe

importazione dalla classe

from class import Class 

E la seconda cosa sono __init__ metodi:

__init__(self,arg1,...,argn): 
    self.arg1 = arg1 
    ... 
    self.argn = argn 

Esistono modi per evitare queste duplicazioni?

risposta

7

La seconda cosa non è la ridondanza: è l'impostazione degli attributi di istanza. Si può fare anche in questo modo:

class Foo: 

    def __init__(self, **kwargs): 
     for name, value in kwargs.items(): 
      setattr(self, name, value) 

Ma allora avete bisogno di chiamare Foo come questo:

Foo(arg1=1, arg2=2, arg3=3) 

anche l'importazione sembra avere la sintassi non corretta. Dovrebbe essere from Class import Class. Questo ti sembra ridondante, perché sembra che tu stia memorizzando ogni classe in un file separato (modulo) e che sia esattamente ridondante. Python non è Java, di solito dovresti contenere più oggetti in un modulo. Tieni presente che il modulo stesso è un oggetto. Inoltre dovresti nominare i moduli correttamente - la guida allo stile del codice di default dice che i moduli dovrebbero essere tutti in minuscolo senza caratteri speciali. Ad esempio, re o urllib.

+0

Grazie già! Ho corretto la mia importazione e manterrò i moduli in minuscolo da ora in poi. Come si potrebbe gestire/modificare i moduli di grandi dimensioni in modo efficace senza dividerli? – Jasper

+0

Cosa intendi per moduli di grandi dimensioni? Le linee di codice 3k sono un modulo di grandi dimensioni? Un tale modulo può contenere molte classi. È possibile codificare molto più scarsamente in python che in 'Java' /' C++ ', quindi mantenere più classi in un modulo non significa che è grande. – gruszczy

1

Versione per args:

class Foo: 

    def __init__(self, *args): 
     for index,arg in enumerate(args): 
      setattr(self, 'arg%s'%index, arg) 


Foo(1,2,3) 
>>> Foo.arg0 
1 
+2

questo è brutto ... – aaronasterling

+0

Sono d'accordo, questo non è affatto Pythonic. L'esplicito è meglio che implicito, e questo mi sembra un caso delicato di magia implicita. –

+1

* Speriamo che * i nomi degli attributi attuali non siano arg0 tramite argN, perché se lo sono, dovrebbero essere una sequenza. Se non lo sono, questa risposta non si applica. –

2
from module import Class 

E 'comune per i nomi delle classi di essere diverso dal nome del loro modulo che contiene. Se hai una sola classe per modulo con un nome identico, considera di spostare quella classe su un livello nella tua gerarchia.

def __init__(self, a, b, c): 
    self.a = a 
    self.b = b 
    self.c = c 

Ciò spesso sembra essere un pò fastidioso, ma in realtà non è male, la leggibilità-saggio, rispetto alle alternative. Tuttavia, se disponi di molti parametri che assegni semplicemente come attributi senza altri lavori nel tuo init, considera l'ereditarietà da un namedtuple o simile, che può generare tale hotplate per te. (Namedtuple in particolare ha altre ramificazioni e sarà a volte adatto. Lo sto usando come esempio di una classe base in grado di gestire questo tipo di piastra.)