2012-04-18 9 views
5

Obtengo un dict para iniciar una persona de clase. hay un campo en persona: 'nombre'. El campo "nombre" es opcional, lo que significa que si el dict no tiene el elemento "nombre", entonces no hay un valor de "nombre" de la persona. Yo uso métodos getter para obtener el atributo de instancia, pero arrojará un error si no hay un valor 'name'. No sé si hay algún buen estilo de programación para mejorar mi código. Debido a que python crea un campo de instancia en tiempo de ejecución, no sé cómo usar getter como java.python: error de atributo de instancia

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: Persona instancia no tiene atributo 'nombre'

+0

Como ya has visto en las respuestas, los getters no son "pitónicos", o un buen código python. [Aquí] (http://tomayko.com/writings/getters-setters-fuxors) es un gran artículo sobre por qué es esto. Para resumir el artículo: Java siempre necesita getters/setters porque sin ellos, la refactorización para usarlos es difícil. Con Python, no cambia su interfaz, ya que puede usar [propiedades] (http://docs.python.org/library/functions.html#property). – Darthfett

Respuesta

6
class Person: 

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

En este caso self.name = person_dict.get('name') no subirá las excepciones y objetos persona tendrá name atributo (None por defecto)

UPD . Debido al método getName es inútil, lo corté del ejemplo. Acceda directamente al name attr.

+0

Vale la pena señalar que los métodos 'getter' son una mala práctica en Python: acceda directamente. –

+0

Acabo de repetir su código. – San4ez

+0

Lo sé, solo estoy diciendo una respuesta que indica que es una mejor. –

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. Esta es una respuesta mejor, los getters son una mala práctica. –

+0

gracias, ahora sé que usar getter no es un buen estilo – remy

0

Si no desea que la excepción, entonces usted debe asegurarse de que la instancia tiene un valor de name. Como la búsqueda vuelve a la clase si no se puede encontrar un atributo en la instancia, una forma sencilla de hacerlo es simplemente agregar name = None (o el valor predeterminado que desee que use la instancia) a la definición de la clase. La asignación al atributo en la instancia "ocultará" el valor predeterminado.

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

Se podría escribir su vez __init__ así:

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

El método de diccionarios get() vuelve None si no se encuentra la clave, o puede proporcionar una segunda discusión con un valor predeterminado diferente .

Cuestiones relacionadas