Python如何调用重载方法的原始实现?自定义字典类场景
解决方案
要实现继承dict且强制使用get()/set()、禁止[]存取的类,核心是在自定义的get()和set()方法里绕过自己重载的__getitem__/__setitem__,直接调用父类dict的原始方法。
实现代码
class MyPackage(dict): def __getitem__(self, key): raise NotImplementedError("请使用get()方法访问元素") def __setitem__(self, key, value): raise NotImplementedError("请使用set()方法设置元素") def get(self, key, default=None): # 直接调用dict的原始取值逻辑,绕过自定义的__getitem__ try: return dict.__getitem__(self, key) except KeyError: return default def set(self, key, value): # 直接调用dict的原始赋值逻辑,绕过自定义的__setitem__ dict.__setitem__(self, key, value)
测试验证
a = MyPackage() a.set('x', 'wow') print(a.get('x')) # 输出: wow print(a.get('y', 'default')) # 输出: default # 以下操作会触发错误,符合预期 # a['x'] = 'test' # 抛出NotImplementedError # print(a['x']) # 抛出NotImplementedError
原理说明
Python中,直接通过dict.__方法名__(self, 参数)的方式调用父类方法,不会触发子类重载的同名方法。这样既保留了dict的底层存储能力,又能通过重载__getitem__/__setitem__阻止外部用[]存取,同时让自定义的get()/set()正常工作。
内容的提问来源于stack exchange,提问作者LiamF
相关产品推荐
相关产品推荐

