为继承字典的Python类创建getter/setter

1 投票
2 回答
2426 浏览
提问于 2025-04-17 04:12

为了方便把数据转换成JSON格式,我通常会创建一个类,这个类是从Python的字典类(dict)继承而来的。如果这个类需要有特定的字段,我希望能有一些方法来获取和设置这些字段。

目前,我是这样构建这个类的:

class MyRequest(dict):
    def __init__(self, firstName=None, lastName=None):
        self['firstName'] = firstName
        self['lastName'] = lastName

    def get_firstName(self):
        return self['firstName']
    def set_firstName(self, firstName):
        self['firstName'] = firstName

    def get_lastName(self):
        return self['lastName']
    def set_lastName(self, lastName):
        self['lastName'] = lastName

不过这样做起来真的很麻烦。因为底层的“存储”是一个字典,所以我不能像这样直接访问字段:

myReq.firstName = "Foo"
print myReq.lastName

但是有没有办法在保持字典支持的同时,做到这一点呢?

2 个回答

2

这样做怎么样:

class MyRequest(dict):
    def __init__(self, firstName=None, lastName=None):
        self['firstName'] = firstName
        self['lastName'] = lastName

    def __getattr__(self, name):
        return self[name]

    def __setattr__(self, name, value):
        self[name] = value

需要注意的是,这样做可能会给你带来麻烦。如果你的某个属性名字和 dict 的一个方法名字相同(比如 update),那么当你获取这个属性时,会得到这个方法,而当你设置这个属性时,会把这个方法覆盖掉。这种情况可能会让你很难找到问题所在。

1

是的,有办法实现你想要的功能。你可以使用属性:

class MyRequest(dict):
    def __init__(self, firstName=None, lastName=None):
        self['firstName'] = firstName
        self['lastName'] = lastName

    @property
    def firstName(self):
        return self['firstName']

    @firstName.setter
    def firstName(self, firstName):
        self['firstName'] = firstName

    @property
    def lastName(self):
        return self['lastName']

    @lastName.setter
    def lastName(self, lastName):
        self['lastName'] = lastName

request = MyRequest('John', 'Connor')
print request.firstName, request.lastName
request.firstName = 'Sarah'
print request.firstName, request.lastName

撰写回答