2012-04-18 16 views
5

ho un dict a init una persona di classe. c'è un campo in persona: 'nome'. Il campo 'name' è facoltativo, nel senso che se il dict non ha l'elemento 'name', allora non c'è il valore 'name' della persona. Io uso i metodi getter per ottenere l'attributo di istanza, ma genererà un errore se non c'è un valore 'nome'. Non so c'è qualche buono stile di programmazione per migliorare il mio codice? Poiché python crea un campo istanza in fase di esecuzione, non so come usare getter come java.pitone: Istanza Attributo errore

class Person: 
    def __init__(self,person_dict): 
     try: 
      self.name = person_dict['name'] 
     except Exception: 
      pass 

    def getName(self): 
     return self.name 

pdict = {} 
p = Person(pdict) 
print p.getName() 

AttributeError: istanza persona non ha un attributo 'name'

+0

Come avete già visto nelle risposte, getter non sono 'divinatorio', o buon codice python. [Here] (http://tomayko.com/writings/getters-setters-fuxors) è un grande articolo sul perché questo è. Per riassumere l'articolo: Java ha sempre bisogno di getter/setter perché senza di essi, il refactoring per usarli è difficile. Con python, non cambi la tua interfaccia, dato che puoi usare [proprietà] (http://docs.python.org/library/functions.html#property). – Darthfett

risposta

6
class Person: 

    def __init__(self,person_dict): 
     self.name = person_dict.get('name') 

In questo caso self.name = person_dict.get('name') non fa salire eccezioni e gli oggetti persona avrà attributo name (None per impostazione predefinita)

UPD . A causa del metodo getName è inutile, l'ho tagliato dall'esempio. Accedi direttamente a name attr.

+0

Vale la pena notare che i metodi 'getter' sono una cattiva pratica in Python - accedetelo direttamente. –

+0

Ho appena ripetuto il suo codice. – San4ez

+0

Lo so, sto solo dicendo una risposta che dice che è meglio. –

3
class Person: 
    def __init__(self,person_dict): 
     self.name = person_dict.get('name', 'default_name') 

pdict = {} 
p = Person(pdict) 
print p.name # there is no need for getter 
+0

+1. Questa è una risposta migliore, i getter sono una cattiva pratica. –

+0

grazie, ora so che usare getter non è un buon stile – remy

0

Se non si desidera che l'eccezione, quindi è necessario assicurarsi che l'istanza ha un valore per name. Poiché la ricerca ricade nella classe se non è possibile trovare un attributo sull'istanza, un modo semplice per farlo è semplicemente aggiungere name = None (o qualsiasi valore predefinito che si desidera venga utilizzato dall'istanza) alla definizione della classe. L'assegnazione all'attributo sull'istanza "nasconde" il valore predefinito.

class Person: 
    name = None 
    def __init__(self,person_dict): 
     try: 
      self.name = person_dict['name'] 
     except Exception: 
      pass 

Si potrebbe invece scrivere il vostro __init__ come questo:

def __init__(self,person_dict): 
    self.name = person_dict.get('name') 

Il metodo di dizionari get() ritorna None se la chiave non viene trovata, oppure è possibile fornire un secondo argomento con un valore predefinito diverso .

Problemi correlati