有没有办法覆盖python中内置类型的特殊函数?例如,我想创建一个继承自内置dict的specialdict类。我想允许用户为我的特殊字典中的键和值定义自定义验证函数,如下所示:
def __init__(self, keyValidator = True, valueValidator = True):
self.keyValidator = keyValidator
self.valueValidator = valueValidator
使用这个,我可以截取update方法中值的加法,如下所示:
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
来引用正常的实现,当你需要的时候)。
你会遇到的一个问题是一些(全部?)其他DICT方法的Buffin实现将不尊重您重写的super(SpecialDict, self).__setitem__(key, value)
或dict.__setitem__(self, key, value)
。因此,您将无法继承它们;您必须重写所有它们,或者根据基本操作的版本完全重新实现它们,或者至少在超类调用周围运行验证。
实际上,一个不那么痛苦的方法可能是不将内置dict子类化,而是实现一个包装普通字典的自定义“dict-like”对象,使用__setitem__
或__getitem__
基类来获取dictionary接口。使用这种方法,您只需要自己实现大约6个基本方法(通过插入对包装字典的调用的验证逻辑来实现),并根据它们获得其他方法的合理定义。见http://docs.python.org/library/collections.html#collections-abstract-base-classes