2012-04-18 207 views
5

我得到一個字典來初始化一個類的人。有一個領域的人:'名字'。 'name'字段是可選的,這意味着如果字典沒有'name'項,那麼沒有'name'值。我使用getter方法獲取實例屬性,但如果沒有「名稱」值,它將引發錯誤。我不知道有沒有什麼好的編程風格來改進我的代碼?因爲python在運行時創建實例字段,所以我不知道如何使用像java這樣的getter。python:實例屬性錯誤

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的:Person實例沒有屬性 '名'

+0

正如你已經在答案中看到的那樣,getter不是'pythonic',也不是好的python代碼。 [這裏](http://tomayko.com/writings/getters-setters-fuxors)是一篇關於這是爲什麼的偉大文章。總結這篇文章:Java總是需要getter/setter,因爲沒有它們,重構使用它們是很困難的。使用python,你不會改變你的界面,因爲你可以使用[properties](http://docs.python.org/library/functions.html#property)。 – Darthfett 2012-04-18 15:01:31

回答

6
class Person: 

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

在這種情況下self.name = person_dict.get('name')不會引發異常和Person對象將有name屬性(默認爲None

UPD 。由於getName方法是無用的,我從例子中刪除它。直接訪問name attr。

+0

值得注意的是'getter'方法在Python中是不好的做法 - 直接訪問它。 – 2012-04-18 13:56:00

+0

我只是重複他的代碼。 – San4ez 2012-04-18 13:57:11

+0

我知道,我只是在回答一個更好的答案。 – 2012-04-18 13:57:40

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。這是一個更好的答案,獲得者是一個不好的習慣。 – 2012-04-18 13:56:56

+0

謝謝,現在我知道使用getter並不是一個好的風格 – remy 2012-04-18 14:21:00

0

如果你不想要例外,那麼你應該確保該實例的值爲name。由於如果在實例中找不到屬性,查找將回落到類中,因此執行此操作的一種簡單方法是隻需將name = None(或您希望實例使用的任何默認值)添加到類定義中。賦值給實例上的屬性將「隱藏」默認值。

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

你可以代替寫你__init__這樣的:

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

如果該鍵沒有找到字典的get()方法返回None,或可以爲用戶提供不同的默認值的第二個參數。