Come strutturare una classe in python

3

Sono arrivato a Python da C ++ (conosco anche un po 'di Java). Sto scrivendo il codice per esercitare un server quindi uso fondamentalmente i metodi http per inviare un carico di richieste al server. Come parte del mio codice ho creato una classe e l'ho chiamata testdata. Questo contiene fondamentalmente dati di input di test (per inviare richieste) e dati di output da controllare.

Con il mio cappello C ++ ho creato un carico di metodi getter e setter che erano una sola riga. Ho persino avuto un metodo __init__ per impostare ad es. self.<some_attribute_name> = "" o qualche default sicuro.

Ora mi rendo conto che puoi liberamente aggiungere attributi ad un oggetto python e non è necessario inizializzare le variabili semplici in init.

Quindi ho alcune domande.

  1. Per la mia classe di testdata, dovrei anche usare una classe?

  2. Aggiungo solo elementi di dati come questo:

    import testing
    
    td = testing.testdata()
    td.sessionid = "123"
    
  3. Ma per quanto riguarda l'accesso ad es. a td.sessionid prima di aver assegnato un valore in precedenza. So che posso usare hasattr ma questo è un onere aggiuntivo. Devo assicurarmi di assegnare sempre prima? Cosa succede se faccio td.sessionid prima che venga persino assegnato qualcosa? Otterrò un AttributeError in fase di runtime. Come gestirlo?

  4. A causa del problema 3. sopra. Devo utilizzare sempre __init__ per inizializzare i dati dei membri su valori predefiniti sicuri? ad es. "" per archi.

Quali sono gli approcci consigliati in Python?

    
posta user619818 26.07.2013 - 12:18
fonte

2 risposte

3

Generalmente, usi gli attributi di classe per fornire i valori predefiniti:

class TestData(object):
    sessionid = None

Devi solo definire un __init__ se devi fornire una nuova istanza con attributi che hanno per essere impostati in modo univoco per quella nuova istanza.

Tuttavia, non definire una classe solo per mantenere lo stato. Utilizza le classi quando fornirai un comportamento di e stato. I tipi standard e la libreria di Python sono altrimenti più che sufficientemente ricchi per coprire le esigenze dei just-data.

    
risposta data 26.07.2013 - 12:32
fonte
1

In risposta alle tue domande:

1. Nella mia esperienza, una raccolta di dati di configurazione correlati è sempre stata contenuta in un dizionario ( link ). Ciò consente una facile manipolazione dei dati senza le preoccupazioni dell'istanza richiesta dalle classi. Dietro le quinte un dizionario è solo un hash table.

2. Non vedo la domanda qui ma per un dizionario hai un certo numero di opzioni, vedi il link sopra ma come esempio:

data = {
    "foo": "123"
}
data["bar"] = 42

Questo esempio mostra sia la creazione di un dizionario con una coppia di valori chiave noti, ma anche come aggiungerne uno nuovo.

3. Innanzitutto non vedo perché vorresti accedervi senza che venga assegnato, quale sarebbe il punto? Tuttavia potresti semplicemente usare la funzione get per aggirare questo problema. Quindi, seguendo l'esempio precedente:

data.get("foo")

ti darebbe "123" mentre:

data.get("woops")

ti darebbe None . Inoltre, puoi passare un secondo argomento come predefinito, ad es.

data.get("woops", "backup")

ti darebbe backup

Solo per completezza se si usasse la notazione di accesso standard [] tentando di accedere a una chiave che non esiste si lancia (chiamato raise in python) un KeyError ma si può affrontare questo usando meccanismi try / catch standard (chiamati prova / tranne in python)

4. Questo punto è un po 'discutibile se si dovesse scendere la radice del dizionario, ma si può semplicemente dire si. Realisticamente questo è ciò che il costruttore è per 'costruire' l'istanza dell'oggetto. Solo perché python ti permette di allocare dinamicamente nuove variabili di istanza non significa che sia la cosa giusta da fare. Se dovessi passare un controllore di lanuggine su quel codice, si lamenterebbe sicuramente

    
risposta data 26.07.2013 - 20:37
fonte

Leggi altre domande sui tag