继承dict的python类的getter/setter
为了帮助序列化为JSON,我通常构建一个继承自python dict类的类。如果类应该有特定的字段,我希望有一些方法可以获取和设置 目前,我构建了一个类,如:继承dict的python类的getter/setter,python,dictionary,getter-setter,Python,Dictionary,Getter Setter,为了帮助序列化为JSON,我通常构建一个继承自python dict类的类。如果类应该有特定的字段,我希望有一些方法可以获取和设置 目前,我构建了一个类,如: class MyRequest(dict): def __init__(self, firstName=None, lastName=None): self['firstName'] = firstName self['lastName'] = lastName def get_first
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
但是,有没有一种方法可以在保持dict支持的情况下到达那里呢?是的,有一种方法可以做你想做的事情。使用属性:
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
那么:
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
),这可能会再次困扰您。在这种情况下,获取该属性将返回该方法,设置该属性将覆盖该方法。这可能很难调试。现在几乎没有理由使用UserDict
。子类化dict
很好。是的,谢谢UserDict
是为了向后兼容python 2.2及更早版本而保留的。实际上,在中有很多原因建议您在执行OP建议时远离属性。例如,您可以使用hasattr返回实际的dict属性(如果它存在),或者尝试返回实际的dict属性并捕获异常以覆盖它。或者您可以使用组合而不是继承。您正在寻找类似于、?