Python对象中数据字段的访问控制
在下面的代码中,我有一个对象,这个对象有两个字段:一个字典和一个聚合器。聚合器的目的是在 O(1) 的时间内计算字典值的总和。
我想使用属性来控制对这些字段的访问,但字典的设置方法从来没有被调用过:
class C:
def __init__(self):
self._p = dict()
self._sum_of_p_values = 0
def get_p(self):
print('getting p')
return self._p
def set_p(self, v):
print('setting p')
self._p = v
print('updating the sum')
self._sum_of_p_values = sum(self._p.values())
def get_sum_of_values(self):
return self._sum_of_p_values
p = property(get_p, set_p, None, None)
sum_of_values = property(get_sum_of_values, None, None, None) #read-only property
c = C()
c.p['a'] = 1 #value created, expect to update the aggregator
c.p['b'] = 2.14 #value created, expect to update the aggregator
# I want c.sum_of_values to be 3.14
print(c.sum_of_values)
这是上面代码的输出:
getting p
getting p
0
实现我的目标的最佳方法是什么?
1 个回答
0
你直接在设置属性,而不是使用你自己的设置方法。试试这个:
class C:
def __init__(self):
self._p = dict()
self._sum_of_p_values = 0
def get_p(self):
print('getting p')
return self._p
def set_p(self, k, v):
print('setting p')
self._p[k] = v
print('updating the sum')
self._sum_of_p_values = sum(self._p.values())
def get_sum_of_values(self):
return self._sum_of_p_values
p = property(get_p, set_p, None, None)
sum_of_values = property(get_sum_of_values, None, None, None) #read-only property
c = C()
c.set_p('a', 1) #value created, expect to update the aggregator
c.set_p('b', 2.14) #value created, expect to update the aggregator
# I want c.sum_of_values to be 3.14
print(c.sum_of_values)
如果你不想直接调用你的设置方法,可以用这种方法: