5

我得到一个命令来启动一个班级的人。个人有一个字段:“姓名”。'name' 字段是可选的,这意味着如果 dict 没有 'name' 项,那么就没有 person 的 'name' 值。我使用 getter 方法来获取实例属性,但如果没有“名称”值,它会抛出错误。不知道有没有什么好的编程风格来改进我的代码?因为python在运行时创建实例字段,所以我不知道如何像java一样使用getter。

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 实例没有属性“名称”

4

3 回答 3

6
class Person:

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

在这种情况下self.name = person_dict.get('name')不会引发 Exception 并且 Person 对象将具有name属性(None默认情况下)

UPD。由于getName方法没用,我从示例中删除了它。直接访问nameattr。

于 2012-04-18T13:54:47.380 回答
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
于 2012-04-18T13:56:20.163 回答
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

于 2012-04-18T13:58:28.413 回答