如何修改从属性装饰器获取的对象?

时间:2018-05-02 07:24:59

标签: python

我们说,这是一个班级A。它有一个私有值_foo,它是一个json字符串,并使用属性getter和setter访问它。

代码如下:

import json

class A(object):
    _foo = '{"name":"name"}'

    @property
    def foo(self):
        return json.loads(self._foo)

    @foo.setter
    def foo(self, value):
        self._foo = json.dumps(value)

通常,我使用foo来执行以下操作:

a = A()
print(a.foo['name'])

但是当我想修改它时,我遇到了麻烦。

a = A()
print(a.foo)
# Out: {'name': 'name'}
a.foo['weight'] = 1
print(a.foo)
# Out: {'name': 'name'} # have no change

我需要做的是:

foo = a.foo
foo['weight'] = 1
a.foo = foo
print(a.foo)

现在,我的问题是如何实现更直观和pythonic?

1 个答案:

答案 0 :(得分:-1)

我认为你这样做的正确方法就是这样,不要将字典保存为字符串,而是将其作为实际的字典保存。

import json
class A(object):
   _foo = {"name":"name"}

   @property
   def foo(self):
       return self._foo

   @foo.setter
   def foo(self, value):
        self._foo = value

   def dump_foo(self):
       jsons.dump(self.foo)

   def __del__(self):
       self.dump_foo()

我无法确定每次转储json文件的真正原因,编辑它,使用它,以及何时完成转储。

  • 如果您仍希望在此之后打印字典(以人类可读的方式),那么您需要做的就是打印(a.foo),因为字母转换为str。