2012-04-18 10 views
5

Dostaję dyktando do inicjowania osoby z klasy. jest jedno pole osobiście: "imię". Pole "nazwa" jest opcjonalne, co oznacza, że ​​jeśli dict nie ma pozycji "nazwa", to nie ma wartości "nazwisko" osoby. Używam metod getter, aby uzyskać atrybut instancji, ale spowoduje to błąd, jeśli nie ma wartości "name". Nie wiem, czy istnieje dobry styl programowania, aby ulepszyć mój kod? Ponieważ python tworzy pole instancji w czasie wykonywania, nie wiem jak używać gettera takiego jak java.python: błąd atrybutu instancji

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: instancja osoba nie ma atrybutu 'name'

+0

Jak już widzieliście w odpowiedziach, gettery nie są "pythonic", ani dobry kod Pythona. [Tutaj] (http://tomayko.com/writings/getters-setters-fuxors) to świetny artykuł na temat tego, dlaczego tak jest. Aby podsumować artykuł: Java zawsze potrzebuje modułów pobierających/ustawiających, ponieważ bez nich refaktoryzacja ich użycia jest trudna. W pythonie nie zmieniasz interfejsu, ponieważ możesz użyć [właściwości] (http://docs.python.org/library/functions.html#property). – Darthfett

Odpowiedz

6
class Person: 

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

W tym przypadku self.name = person_dict.get('name') nie podniesie wyjątek i obiektów osoba będzie miała atrybut name (None domyślnie)

UPD . Z powodu metody getName jest ona bezużyteczna, wyciąłem ją z przykładu. Uzyskaj bezpośredni dostęp do name attr.

+0

Warto zauważyć, że metody "getter" są złym zwyczajem w Pythonie - dostęp do nich bezpośrednio. –

+0

Właśnie powtórzyłem jego kod. – San4ez

+0

Wiem, mówię tylko odpowiedź, która stwierdza, że ​​jest lepsza. –

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. To jest lepsza odpowiedź, gettery to zła praktyka. –

+0

dziękuję, teraz wiem, że getter nie jest dobrym stylem – remy

0

Jeśli nie chcesz wyjątek, to należy upewnić się, że instancja ma wartość name. Ponieważ wyszukiwanie powraca do klasy, jeśli nie można znaleźć atrybutu na instancji, prostym sposobem na to jest dodanie do definicji klasy name = None (lub jakiejkolwiek wartości domyślnej, której chcesz użyć). Przypisanie do atrybutu instancji "ukryje" domyślną wartość.

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

Można zamiast napisać __init__ takiego:

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

get() metoda słowników zwraca None jeśli klucz nie zostanie znaleziony, czy można podać drugi argument o innej wartości domyślnej .

Powiązane problemy