对python对象中数据字段的访问控制

对python对象中数据字段的访问控制,python,access-control,Python,Access Control,在下面的代码中,我有一个带有两个字段的对象:字典和聚合器。聚合器的目标是在O(1)时间内给出字典值的总和。 我想使用属性来控制对字段的访问,但从未调用dict setter: class C: def __init__(self): self._p = dict() self._sum_of_p_values = 0 def get_p(self): print('getting p') return self._

在下面的代码中,我有一个带有两个字段的对象:字典和聚合器。聚合器的目标是在O(1)时间内给出字典值的总和。 我想使用属性来控制对字段的访问,但从未调用dict setter:

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

实现我的目标的最佳方法是什么?

您直接设置属性,而不是使用setter方法。试试这个:

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)
如果不想直接调用setter,可以使用以下方法:


你是对的,我不想直接调用setter,我想保持“干净”的语法。否则,需要删除
p
的属性定义,以确保不会造成混淆。