2010-08-26 12 views
18

Sto mettendo un po 'di materiale correlato in una classe. Lo scopo principale è organizzarli in uno spazio dei nomi.È una buona idea usare la classe come spazio dei nomi in Python

class Direction: 

    north = 0 
    east = 1 
    south = 2 
    west = 3 

    @staticmethod 
    def turn_right(d): 
    return turn_to_the_right 

    @staticmethod 
    def turn_left(d): 
    return turn_to_the_left 



# defined a short alias because direction will be used a lot 
D = Direction 

d0 = D.north 
d1 = D.turn_right(d) 

Non c'è molto concetto di oggetto coinvolto. In C++, userò la parola chiave lingua effettiva namespace. Non esiste una cosa simile in Python. Quindi sto cercando di usare class per questo scopo.

Questa è una buona idea? Qualche trappola con questo approccio?

Ho appena risposto a una domanda correlata ieri. Questa domanda viene posta in un altro modo. È una decisione effettiva che devo prendere per me stesso.

Metodo statico vs funzione modulo python - Stack Overflow

Static method vs module function in python

+0

Grazie. Finora il commento che ho ottenuto è 1. Utilizzare il modulo 2. Fare ciò che ha senso. Quello che voglio ancora capire è se la classe è considerata un'opzione legittima per il semplice utilizzo come namespace o se ci sono buone ragioni per non farlo. –

risposta

14

No. Stick in un modulo, invece.

Python non ha spazi dei nomi nello stesso modo in cui lo fa C++, ma i moduli hanno uno scopo un po 'simile (ovvero raggruppano classi e funzioni "mi piace" e assegnando loro nomi univoci per evitare interferenze).

Modifica
ho visto il commento che avete inviato alla tua domanda. Per rispondere in modo più esplicito, no, nel codice Pythonic non è proprio corretto usare una classe per emulare uno spazio dei nomi. I moduli sono lì per raggruppare classi, funzioni e variabili correlate - usa invece un modulo. Una classe rappresenta una "cosa" che ha un comportamento (metodi) e dati (variabili di istanza) - non è solo una raccolta di funzioni e variabili indipendenti.

+2

C'è una giustificazione più forte per il modulo? Posso pensare a un'opzione da fare 'from direction import *'. D'altra parte, se ci sono solo 4 costanti "nord, est, sud, ovest", sembra un eccesso di metterle nel proprio modulo. –

+1

Dovresti metterli dove hanno senso, dal punto di vista organizzativo. Se "vanno insieme" con un modulo esistente, mettili lì (potresti rinominarli in "DIRECTION_NORTH" o qualsiasi altra cosa). In caso contrario, mettili in un modulo separato, se questo ha senso. – mipadi

+0

Il tuo razionale per l'utilizzo di una classe invece di un modulo per il namespace nega le qualità molto reali che entrambe le cose condividono in Python. Più uguale a diverso. – uchuugaka

2

Sì, va bene. È anche possibile utilizzare property per rendere i metodi simili agli attributi.

Se si dispone di una grande classe, potrebbe essere più ordinato di utilizzare un modulo

2

Dipende dalla situazione; se è possibile inserire una costante nel modulo e avere un senso, farlo in ogni caso, ma inserirli nella classe può rendere più ovvio il loro significato e consentire a costanti simili di avere più "astrazioni": posizionandole nel ServerError la classe ha più senso che averli tutti preposti con SERVER_ERROR residenti liberamente nel modulo.

Fai ciò che è più intuitivo, ma cerca di evitare l'inquinamento dello spazio dei nomi.

4

Sì, davvero. È possibile utilizzare le classi Python rigorosamente per namespacing in quanto è una delle cose speciali che possono fare e fare diversamente dai moduli. È molto più semplice definire una classe come spazio dei nomi in linea in un file piuttosto che generare più file. Non dovresti farlo senza commentare il tuo codice dicendo a cosa serve. Le classi Python sono disponibili in molte forme e scopi diversi e questo rende difficile la comprensione del codice che non hai mai visto prima.

Una classe Python utilizzata come spazio dei nomi non è meno una classe Python di una che soddisfa la percezione di ciò che una classe è in altre lingue. Python non richiede che una classe sia istanziata per essere utile. Non richiede ivars e non richiede metodi. È abbastanza flessibile.

Clases può contenere anche altre classi.

Un sacco di persone hanno le loro idee su ciò che è o non è Pythonico. Ma se fossero tutti preoccupati per qualcosa di simile alla coerenza, avrebbero spinto ad avere cose come len()dir() e help() essere un metodo di oggetti piuttosto che una funzione globale.

Fare ciò che funziona, commentarlo/documentarlo se non è usuale o evidente.

Problemi correlati