Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承dict的python类的getter/setter_Python_Dictionary_Getter Setter - Fatal编程技术网

继承dict的python类的getter/setter

继承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

为了帮助序列化为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

但是,有没有一种方法可以在保持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属性并捕获异常以覆盖它。或者您可以使用组合而不是继承。您正在寻找类似于、?