有没有办法覆盖 python 中内置类型的特殊函数?例如,我想创建一个继承自内置字典的 SpecialDict 类。我想允许用户为我的特殊字典中的键和值定义自定义验证函数,如下所示:
def __init__(self, keyValidator = True, valueValidator = True):
self.keyValidator = keyValidator
self.valueValidator = valueValidator
使用它,我可以拦截更新方法中的值添加,如下所示:
def update(self,key,value):
assert (self.keyValidator(key))
assert (self.valueValidator(key))
self[key] = value
但如果有人决定继续使用 [] 作为访问权限,这将不起作用。或者如果有人使用字典文字创建对象。
mySpecialDict = SpecialDict
mySpecialDict['hello'] = 54
最佳答案
有人不能将您的 SpecialDict
实例创建为字典文字,因为字典文字就是这样;普通字典。
至于使用方括号表示法设置项目,如 mySpecialDict['hello'] = 54
,它正好对应于 mySpecialDict.__setitem__('hello', 54)
。同样,使用方括号表示法检索项目对应于 __getitem__
方法的调用。无论 mySpecialDict
是什么类都是如此;无论是普通字典、内置 dict
的子类,还是一些完全不相关的类。因此,您可以只实现这些方法来改变它们的作用(使用 super(SpecialDict, self).__setitem__(key, value)
或 dict.__setitem__(self, key, value)
以在需要时引用正常的实现)。
您将遇到的一个问题是其他字典方法的某些(全部?)内置实现不会遵守您覆盖的 __setitem__
或 __getitem__
。所以你将无法继承它们;您必须重写所有这些并根据您的基本操作版本完全重新实现它们,或者至少“围绕”父类(super class)调用运行您的验证。
实际上,一种不那么痛苦的方法可能是不对内置字典进行子类化,而是实现一个包装普通字典的自定义“类字典”对象,使用collections.Mapping
或 collections.MutableMapping
基类来获取字典接口(interface)。使用这种方法,您只需要自己实现大约 6 个基本方法(您可以通过围绕对包装字典的调用插入验证逻辑来实现),并基于它们获得其他方法的合理定义。参见 http://docs.python.org/library/collections.html#collections-abstract-base-classes
关于python - 覆盖 Python 中的特殊函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644417/