MST

星途 面试题库

面试题:自定义Python字典类实现特定数据一致性和访问控制

请设计并实现一个自定义的Python字典类,要求该类在每次更新(添加或修改)键值对时,确保所有值的总和始终为100(若总和超过100则按照一定比例调整所有值),并且对于某些特定的键(例如以'private_'开头的键),只能在类内部访问,外部无法直接获取和修改。请给出完整的类定义及关键方法的实现代码,并说明设计思路。
21.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 数据存储:使用Python内置的字典来存储键值对。
  2. 值总和控制:在每次更新键值对时,检查所有值的总和是否超过100。如果超过,则按比例调整所有值,使总和为100。
  3. 特定键访问控制:对于以'private_'开头的键,通过自定义的访问方法来实现类内部访问,外部无法直接获取和修改。

代码实现

class CustomDict:
    def __init__(self):
        self.data = {}

    def __setitem__(self, key, value):
        self.data[key] = value
        total = sum(self.data.values())
        if total > 100:
            ratio = 100 / total
            for k in self.data:
                self.data[k] *= ratio

    def __getitem__(self, key):
        if key.startswith('private_'):
            raise AttributeError("Can't access private key from outside")
        return self.data[key]

    def get_internal(self, key):
        return self.data.get(key)

    def set_internal(self, key, value):
        self.data[key] = value
        total = sum(self.data.values())
        if total > 100:
            ratio = 100 / total
            for k in self.data:
                self.data[k] *= ratio

使用示例

cd = CustomDict()
cd['public_key1'] = 50
cd['public_key2'] = 50
print(cd['public_key1'])  
try:
    print(cd['private_key'])  
except AttributeError as e:
    print(e)  

cd.set_internal('private_key', 30)
print(cd.get_internal('private_key'))