为继承字典的Python类创建getter/setter
为了方便把数据转换成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