2012-04-18 178 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,或可以为用户提供不同的默认值的第二个参数。